日期:2014-05-20  浏览次数:20863 次

求助!将java中int类型在内存中的二进制形式,按位输出。
RT.
今天闲来无事,突然想看看亲眼看看数据在内容中的二进制表示。
下面是关键代码:
当变量x为正数的时候,结果是正确的。但是为负数的时候最高位却是0.其实应该为1。
-3的补码是:1111 1111 1111 1111 1111 1111 1111 1101
但是以下代码输出的结果是 0111 1111 1111 1111 1111 1111 1111 1101。最高位不正确。求知情人士帮忙分析一下啊。
int x = -3;
for(int i=31;i>=0;i--) {
  System.out.print(((x&(int)Math.pow(2,i))>>>i)+" ");
}
说一下我的思路,x&(int)Math.pow(2,i)从最高位开始依次分离每一位上的数据。然后就是把分离出来的数据转换成一个int类型,打印出来。


------解决方案--------------------
int i=214332;
System.out.println(Integer.toBinaryString(i));
// 110100010100111100

你也可以通过Integer的toHexString方法查看十六进制字符串表示。
------解决方案--------------------
(int) Math.pow(2, i) 当 i = 31 时得到的值为 2147483647,这个值是 Integer.MAX_VALUE 也就是:

0111 1111 1111 1111 1111 1111 1111 1111

最高位为 0,跟负数进行位与运算时,符号位会被清为 0,你的代码改成这样就可以用了:

Java code
for (int i = 31; i >= 0; i--) {
    System.out.print(((x & (1 << i)) >>> i) + " ");
}