如何在java中获得一个整数的0填充二进制表示?
例如,对于1, 2, 128, 256
输出可以是(16位):
0000000000000001 0000000000000010 0000000010000000 0000000100000000
我试过了
String.format("%16s", Integer.toBinaryString(1));
它为左填充留出空间:
` 1'
如何把0
填充。 我无法在Formatter中find它。 还有另一种方法吗?
提前致谢。
PS 这篇文章描述了如何格式整数与左0填充,但它不是二进制表示。
我认为这是一个不太理想的解决scheme,但是你可以这样做
String.format("%16s", Integer.toBinaryString(1)).replace(' ', '0')
在java.util.Formatter中没有内置二进制转换,我build议您使用String.replace来replace空格字符为零,如下所示:
String.format("%16s", Integer.toBinaryString(1)).replace(" ", "0")
或者实现自己的逻辑,将整数转换为二进制表示,并在此处添加左边的填充符。 或者,如果您确实需要传递数字格式,则可以将二进制表示forms转换为BigIntegerforms,然后使用前导零forms进行格式化,但是在运行时这会非常昂贵,如下所示:
String.format("%016d", new BigInteger(Integer.toBinaryString(1)))
我正在尝试各种各样的方法调用,以前我没有真正使用过这些方法调用,他们一直以适度的成功进行工作,直到我想到了一些非常简单的方法,它可能会起作用。
我敢肯定这是以前的想法,不知道是否对长string的二进制代码有好处,但它对16位string工作正常。 希望它有帮助! (注意第二块代码是改进的)
String binString = Integer.toBinaryString(256); while (binString.length() < 16) { //pad with 16 0's binString = "0" + binString; }
感谢威尔帮助改善这个答案,使其工作与一个循环。 这可能有点笨拙,但它的工作原理,请改善和评论回来,如果你可以….
binString = Integer.toBinaryString(256); int length = 16 - binString.length(); char[] padArray = new char[length]; Arrays.fill(padArray, '0'); String padString = new String(padArray); binString = padString + binString;
你可以使用Apache Commons的StringUtils 。 它提供了填充string的方法:
StringUtils.leftPad(Integer.toBinaryString(1), 16, '0');
我不知道“正确”的解决scheme,但我可以build议你一个快速的补丁。
String.format("%16s", Integer.toBinaryString(1)).replace(" ", "0");
我刚刚尝试过,看到它工作正常。
这里是一个旧post的新答案。
要将具有前导零的二进制值填充到特定长度,请尝试以下操作:
Integer.toBinaryString( (1 << len) | val ).substring( 1 )
如果len = 4
, val = 1
,
Integer.toBinaryString( (1 << len) | val )
然后返回string"10001"
"10001".substring( 1 )
丢弃第一个字符。 所以我们得到我们想要的:
"0001"
如果val
可能是负数,请尝试:
Integer.toBinaryString( (1 << len) | (val & ((1 << len) - 1)) ).substring( 1 )
尝试…
String.format("%016d\n", Integer.parseInt(Integer.toBinaryString(256)));
我不认为这是做这个“正确”的方式…但它的工作:)
user3608934的一个简单版本的想法“这是一个古老的技巧,创build一个16 0的string,然后附加你得到的修剪的二进制string:”
private String toBinaryString32(int i) { String binaryWithOutLeading0 = Integer.toBinaryString(i); return "00000000000000000000000000000000" .substring(binaryWithOutLeading0.length()) + binaryWithOutLeading0; }
一个天真的解决scheme,工作将是
String temp = Integer.toBinaryString(5); while (temp.length() < Integer.SIZE) temp = "0"+temp; //pad leading zeros temp = temp.substring(Integer.SIZE - Short.SIZE); //remove excess
另一种方法是
String temp = Integer.toBinaryString((m | 0x80000000)); temp = temp.substring(Integer.SIZE - Short.SIZE);
这将产生一个整数5的16位string
这是一个古老的技巧,创build一个16 0的string,然后附加从String.format(“%s”,Integer.toBinaryString(1))得到的修剪二进制string,并使用最右边的16个字符,删除任何领先0。 更好的是,制作一个函数,让你指定你想要的二进制string的长度。 当然有可能是其他的方式来完成这个包括图书馆,但我添加这个post来帮助一个朋友:)
public class BinaryPrinter { public static void main(String[] args) { System.out.format("%d in binary is %s\n", 1, binaryString(1, 4)); System.out.format("%d in binary is %s\n", 128, binaryString(128, 8)); System.out.format("%d in binary is %s\n", 256, binaryString(256, 16)); } public static String binaryString( final int number, final int binaryDigits ) { final String pattern = String.format( "%%0%dd", binaryDigits ); final String padding = String.format( pattern, 0 ); final String response = String.format( "%s%s", padding, Integer.toBinaryString(number) ); System.out.format( "\npattern = '%s'\npadding = '%s'\nresponse = '%s'\n\n", pattern, padding, response ); return response.substring( response.length() - binaryDigits ); } }
我会用下面的方法编写我自己的util类
public class NumberFormatUtils { public static String longToBinString(long val) { char[] buffer = new char[64]; Arrays.fill(buffer, '0'); for (int i = 0; i < 64; ++i) { long mask = 1L << i; if ((val & mask) == mask) { buffer[63 - i] = '1'; } } return new String(buffer); } public static void main(String... args) { long value = 0b0000000000000000000000000000000000000000000000000000000000000101L; System.out.println(value); System.out.println(Long.toBinaryString(value)); System.out.println(NumberFormatUtils.longToBinString(value)); }
}
输出:
五 101 0000000000000000000000000000000000000000000000000000000000000101
同样的方法可以应用于任何整型。 注意掩码的types
long mask = 1L << i;
这个方法将int转换为一个String,length = bits。 填充0或截断最重要的位。
static String toBitString( int x, int bits ){ String bitString = Integer.toBinaryString(x); int size = bitString.length(); StringBuilder sb = new StringBuilder( bits ); if( bits > size ){ for( int i=0; i<bits-size; i++ ) sb.append('0'); sb.append( bitString ); }else sb = sb.append( bitString.substring(size-bits, size) ); return sb.toString(); }
你可以使用lib https://github.com/kssource/BitSequence 。 它接受一个数字,并返回string,填充和/或分组。
String s = new BitSequence(2, 16).toBynaryString(ALIGN.RIGHT, GROUP.CONTINOUSLY)); return 0000000000000010 another examples: [10, -20, 30]->00001010 11101100 00011110 i=-10->00000000000000000000000000001010 bi=10->1010 sh=10->00 0000 0000 1010 l=10->00000001 010 by=-10->1010 i=-10->bc->11111111 11111111 11111111 11110110
for(int i=0;i<n;i++) { for(int j=str[i].length();j<4;j++) str[i]="0".concat(str[i]); }
str[i].length()
是数字2的长度,二进制是01,长度是2,将数字4更改为所需的最大长度。 这可以优化为O(n)。 通过使用继续。