public static void main(String []args){
String s="爱慕";
byte[] bytes=s.getBytes();
for(byte b:bytes){
System.out.println(Integer.toBinaryString(b)+" ");
}
}
输出结果是:
11111111111111111111111110110000 (ffffffb0 十六进制)
11111111111111111111111110101110 (ffffffae 十六进制)
11111111111111111111111111000100 (ffffffc4 十六进制)
11111111111111111111111110111101 (ffffffbd 十六进制)
这里一个字节用二进制表示占32位,怎么解释才能让其与一个字节占8位不冲突。
汉字转成 byte 后,每个字节的数值基本上都是大于 0x7F的,即是负值。
所以输出时,输出的结果前面都是 FF。
http://blog.csdn.net/androiddeveloper_lee/article/details/6619414
因为在gb2312编码下一个汉字占两个字节,所以bytes数组长度是4 里边的值为[-80, -82, -60, -67];
public static String toBinaryString(int i)
以二进制(基数 2)无符号整数形式返回一个整数参数的字符串表示形式。
如果参数为负,该无符号整数值为参数加上 232;否则等于该参数。将该值转换为二进制(基数 2)形式的无前导 0 的 ASCII 数字字符串。如果无符号数的大小为零,则用一个零字符 '0' (’\u0030’) 表示它;否则,无符号数大小的表示形式中的第一个字符将不是零字符。字符 '0' ('\u0030') 和 '1' ('\u0031') 被用作二进制数字。
你这个地方如果参数用个正数,输出的就是八位,
至于为什么输出32位我的理解是:代码Integer.toBinaryString(b)+" "虽然入参是byte类型,但java自动将byte转为了整型;整型占四个字节,不管正数负数都应该是32位,只是正数情况下这个方法把前24位给省略了。。。。11111111111111111111111110110000 这是-81的补码,首位不变(f符号位)其余位取反然后最后一位再加1即:10000000 00000000 00000000 01010000以上说得时猜测,说错了大神勿喷,,,下边是jdk源码,我没细看,
java 源码如下
public static String toBinaryString(int i) {
return toUnsignedString0(i, 1);
}
private static String toUnsignedString0(int val, int shift) {
// assert shift > 0 && shift <=5 : "Illegal shift value";
int mag = Integer.SIZE - Integer.numberOfLeadingZeros(val);
int chars = Math.max(((mag + (shift - 1)) / shift), 1);
char[] buf = new char[chars];
formatUnsignedInt(val, shift, buf, 0, chars);
// Use special constructor which takes over "buf".
return new String(buf, true);
}
static int formatUnsignedInt(int val, int shift, char[] buf, int offset, int len) {
int charPos = len;
int radix = 1 << shift;
int mask = radix - 1;
do {
buf[offset + --charPos] = Integer.digits[val & mask];
val >>>= shift;
} while (val != 0 && charPos > 0);
return charPos;
}