详解java整数打印的二进制代码

首先要明白以下概念:

原码:第一位为符号位(符号位表示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   转载请在文章页面明显位置给出原文连接 谢谢合作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值