Java打印整数的二进制表示(代码与解析)

int a=-99;
for(int i=0;i<32;i++){
int t=(a & 0x80000000>>>i)>>>(31-i);
System.out.print(t);
}

拆分一下这段代码,要理解这个移位输出的问题还需要理解的以下内容:
* 0x80000000是数的十六进制表示,转成二进制表示为10000000000000000000000000000000
* 运算的优先级,移位运算高于逻辑运算,>>>高于&
* 位逻辑与运算 1&1 = 1 ,0&1 = 0
* >>>无符号右移,移出部分舍弃,左边位补0;

for循环的语句块的执行顺序:
1 0x80000000 无符号右移 i位;
2 a 和 1的结果做按位与;
3 2的结果无符号右移31-i位
4 输出3的结果

-99的机器数(补码)表示
11111111111111111111111110011101
循环过程演示:
i = 0
1 10000000000000000000000000000000 >>> 0 = 10000000000000000000000000000000
2 11111111111111111111111110011101 & 10000000000000000000000000000000 = 10000000000000000000000000000000
3 10000000000000000000000000000000 >>> (31 - 0) = 00000000000000000000000000000001
4 输出00000000000000000000000000000001,屏显“1”

i = 1
1 10000000000000000000000000000000 >>> 1 = 01000000000000000000000000000000
2 11111111111111111111111110011101 & 01000000000000000000000000000000 = 01000000000000000000000000000000
3 10000000000000000000000000000000 >>> (31 - 1) = 00000000000000000000000000000001
4 输出00000000000000000000000000000001,屏显“1”

……

i = 30
1 10000000000000000000000000000000 >>> 30 = 00000000000000000000000000000010
2 11111111111111111111111110011101 & 00000000000000000000000000000010 = 00000000000000000000000000000000
3 00000000000000000000000000000000 >>> (31 - 30) = 00000000000000000000000000000000
4 输出00000000000000000000000000000000,屏显“0”

i = 31
1 10000000000000000000000000000000 >>> 31 = 00000000000000000000000000000001
2 11111111111111111111111110011101 & 00000000000000000000000000000001 = 00000000000000000000000000000001
3 00000000000000000000000000000001 >>> (31 - 31) = 00000000000000000000000000000001
4 输出00000000000000000000000000000001,屏显“1”

根据循环过程可以看出
(0x80000000 >>> i)的作用是mask,每次循环都与a做逻辑与操作,取a的第i位;
对上条结果>>> 31 - i作用是把取出的a的第i位移到最末位。

最新文章

  1. 关于ajax为什么会返回php整个源码
  2. mongoperf
  3. 语义化HTML:p、h1-6、q、blockquote、hr、address、code、pre、var、cite、dfn和samp
  4. [leetcode]_Sum Root to Leaf Numbers
  5. 【译】Android系统简介—— Activity
  6. Magento事件机制 - Magento Event/Observer
  7. jQuery.Deferred对象
  8. javascript笔记4之运算符
  9. 使用 Gitbook 打造你的电子书
  10. JAVA反射中的getFields()方法和getDeclaredFields ()方法的区别
  11. 软考之路--J2SE,从HelloWorld到传世代码
  12. 1.求链表中的倒数第K个节点
  13. Appium环境搭建——安卓模拟器(AVD)调试 2-运行Apk失败点的总结
  14. CSS3-loading动画
  15. Java执行JavaScript代码
  16. leetcode — remove-element
  17. (下一篇博客)提示5G信道
  18. (原创 开源)AppWidge的使用—桌面便利贴
  19. Linux常用命令详解-目录文件操作命令
  20. day 21 今日学习内容

热门文章

  1. oc 中的.m和.mm文件区别
  2. Win8.1设置ftp服务器并设定用户操作权限的详细教程
  3. Android应用如何适配不同分辨率的手机
  4. EF相同Context升级为分布式事务的原因
  5. MySQL日期与时间戳互转函数
  6. 转 MySQL中的行级锁,表级锁,页级锁
  7. mysql-5.7 innodb 的并行任务调度详解
  8. mac重装系统
  9. RhinoMock学习-绑定回调
  10. xilinx 官方技术资料