算法新手模块学习之打印int类型变量的二进制

给一个数字,打印出它的二进制

  public static void main(String[] args) {
      int num = -5;
      int num2 = -num;
      int num3 = ~num+1;
      print(num);
      print(num2);
      print(num3);
  }
  public static void print(int num){
      for (int i = 31; i >=0 ; i--) {
          int result = num & (1 << i);
          System.out.print(result==0?0:1);
      }
      System.out.println();
  }

这里讲一下原理:
前置知识为:
一、0 & 1或者0 的结果为 0 ,只有 1 & 1 的结果为1
二、数字 1 的二进制是:00000000…001 ,1<<1是什么意思呢?
其实就是就是二进制左移一位,用0来补位,即000000…010
1<<32就是:100000…000
我们都知道数字 6 的二进制是:00000000…110
数字 1 的二进制是:00000000…001
那么 6 & 1 的二进制结果为:00000000…000也就是十进制的 0
6 & 1 是不是等同于 6 & (1<<0)?
同理可见,只要原数字 num 与 1 左移i位之后(1<<i)的结果为十进制的0,那么第i位
的数字一定为0,如果结果为1,那么第i位的数字一定为1

一个int类型变量是多少位?32位,所以遍历32次,搞定。

补充一:这里补充说明一下右移,右移分无符号右移(>>)和有符号右移(>>>)
前置知识:
int变量为32位,其实第32位是符号位,真正用来表示数值的只有31位,第32位为0代表这个数为正数,
1代表这个数为负数。
无符号右移的意思是:数字 -5的二进制是:11111…111111011
那么-5>>1即无符号右移是啥意思呢,其实就是除了符号位以外的其他31位整体往右移动一位,即11111…111111101
那-5>>>1就是连符号位一起整体往右移动一位,用0来补位,即0111111…111111101

补充二:这里补充说明一下 反数 5=-(-5) 等同于 5=~(-5)+1 ~为取反符号
-5 为11111…11111011
-(-5) 就为00000…00000101
这个就是人家定的算法,即取反加1,就是原来的二进制数字取反加1可以得到它的反数,
-5 11111…1111111011取反为00000…0000100 再加1为0000…0000101即为5
是不是很奇怪为啥要取反加1,其实他是为了+5和-5取反都走这个取反加1的流程而设置
的算法,如果不是这样设计,那么-5要走一套流程,+5又要走另外一套流程,性能就差
了,所以要设计为取反加1,走一套流程
+5 为00000…00000101
-(+5) 为+5取反加1即 111111…11111010 -----> 111111…11111011

才疏学浅,有讲错的地方望留言指出,共同进步

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值