首先要明白以下概念:
原码:第一位为符号位(符号位表示0为正数,1为负数)
负数反码:符号位不管,原码取反
负数补码:符号位不管,反码加1
正数补码:和原码相同按位与的运算1&1 = 1 ,0&1 = 0,0&0 = 0
举些小例子如
3的原码为00000011 补码为00000011
-1的原码: 10000001 反码: 11111110 补码: 11111111
-6的原码: 10000110 反码: 11111001 补码: 11111010
OK,现在进入正题。。。
在java中打印整数的二进制表示代码为:
举个-21的例子给大家展示一下
int a=-21;
for(int i=0;i<32;i++){
int t=(a & 0x80000000>>>i)>>>(31-i);
System.out.print(t);
}
分析一下这段代码先
首先要先明白>>>运算优先级高于&
int类型相当4个字节,1个字节8位,所以有32位。
0x80000000为16进制,所以其二进制为1000 0000 0000 0000 0000 0000 0000 0000
for循环里面的执行顺序:
第一步:0x80000000 无符号右移i位;
第二步:a和 0x80000000 无符号右移i位的结果做按位与运算;
第三步:再将上面运算后的结果无符号右移31-i位
最后对输出结果进行显示
在这里31 - i作用是在每次循环的过程中把取出的a的第i位移到最末位
-21的机器数(补码)表示
1111 1111 1111 1111 1111 1111 1110 1011
循环的过程演示:
i = 0
第一步: 1000 0000 0000 0000 0000 0000 0000 0000 >>> 0位 = 1000 0000 0000 0000 0000 0000 0000 0000
第二步: 1111 1111 1111 1111 1111 1111 1110 1011 & 1000 0000 0000 0000 0000 0000 0000 0000 = 1000 0000 0000 0000 0000 0000 0000 0000
第三步: 1000 0000 0000 0000 0000 0000 0000 0000>>> (31 - 0)位 = 0000 0000 0000 0000 0000 0000 0000 0001
第四步: 输出0000 0000 0000 0000 0000 0000 0000 0001,屏显的结果为“1”。
i = 1
第一步 1000 0000 0000 0000 0000 0000 0000 0000 >>> 1 = 0100 0000 0000 0000 0000 0000 0000 0000
第二步: 1111 1111 1111 1111 1111 1111 1110 1011& 0100 0000 0000 0000 0000 0000 0000 0000 = 0100 0000 0000 0000 0000 0000 0000 0000
第三步: 0100 0000 0000 0000 0000 0000 0000 0000>>> (31 - 1)位 = 0000 0000 0000 0000 0000 0000 0000 0001
第四步: 输出0000 0000 0000 0000 0000 0000 0000 0001,屏显的结果为“1”。
i = 2
第一步 1000 0000 0000 0000 0000 0000 0000 0000 >>> 2 = 0010 0000 0000 0000 0000 0000 0000 0000
第二步: 1111 1111 1111 1111 1111 1111 1110 1011& 0010 0000 0000 0000 0000 0000 0000 0000 = 0010 0000 0000 0000 0000 0000 0000 0000
第三步: 0010 0000 0000 0000 0000 0000 0000 0000>>> (31 - 2)位 = 0000 0000 0000 0000 0000 0000 0000 0001
第四步: 输出0000 0000 0000 0000 0000 0000 0000 0001,屏显的结果为“1”。
……(中间太多了我就省略了。。。过程相似的)
i = 29
第一步: 1000 0000 0000 0000 0000 0000 0000 0000 >>> 29 = 0000 0000 0000 0000 0000 0000 0000 0100
第二步: 1111 1111 1111 1111 1111 1111 1110 1011& 0000 0000 0000 0000 0000 0000 0000 0100 = 0000 0000 0000 0000 0000 0000 0000 0000
第三步: 0000 0000 0000 0000 0000 0000 0000 0000>>> (31 - 29)位 = 0000 0000 0000 0000 0000 0000 0000 0000
第四步: 输出0000 0000 0000 0000 0000 0000 0000 0000,显示结果为“0”。
i = 30
第一步: 1000 0000 0000 0000 0000 0000 0000 0000 >>> 30 = 0000 0000 0000 0000 0000 0000 0000 0010
第二步: 1111 1111 1111 1111 1111 1111 1110 1011& 0000 0000 0000 0000 0000 0000 0000 0010 = 0000 0000 0000 0000 0000 0000 0000 0010
第三步: 0000 0000 0000 0000 0000 0000 0000 0010 >>> (31 - 30)位 = 0000 0000 0000 0000 0000 0000 0000 0001
第四步: 输出0000 0000 0000 0000 0000 0000 0000 0001,显示结果为“1”。
i = 31
第一步: 1000 0000 0000 0000 0000 0000 0000 0000 >>> 31 = 0000 0000 0000 0000 0000 0000 0000 0001
第二步:1111 1111 1111 1111 1111 1111 1110 1011& 0000 0000 0000 0000 0000 0000 0000 0001 = 0000 0000 0000 0000 0000 0000 0000 0001
第三步:0000 0000 0000 0000 0000 0000 0000 0001>>> (31 - 31)位 = 0000 0000 0000 0000 0000 0000 0000 0001
第四步:输出0000 0000 0000 0000 0000 0000 0000 0001,显示结果为“1”。
作者:zeng308041977 转载请在文章页面明显位置给出原文连接 谢谢合作