给一个数字,打印出它的二进制
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
才疏学浅,有讲错的地方望留言指出,共同进步