想法
如果我想知道一个整数(32位)它对应的二进制为多少,可以怎么办呢?
我们先来看一段代码(算法)
public static void print(int num){
for(int i=31;i>=0;i--){
System.out.print((num&(1<<i))==0?"0":"1");//左移
}
System.out.println();
}
左移
当我输入一个整数时,首先这个整数会有它对应的二进制
例如1= 0 000 0000 0000 0000 0000 0000 0000 0001
1.(1<<i)表示把数字1左移 i 位,这样刚开始就移到了上述 标黄的位置
用1与该位上的数字做与(&)运算,之后移动的位置不断地后移一位
2. 若结果为0,则表明num上该位为0,
若结果为1,则表明num上该位为1
遍历完成后,就得到了num对应的二进制啦!
测试
public static void main(String[] args) {
int num=4;
print(num);
}
右移
其实大体与左移类似,但需注意一点
当每一位均右移后,最高位补什么?
这里介绍两种右移
1.>>
有符号右移,意思就是右移后,最高位补符号位
原来是正数,补0
原来是负数,补1
2.>>>
无符号右移,均补0
public static void main(String[] args) {
int a=Integer.MIN_VALUE;
print(a);
print(a>>1);//右移一位,那最高位得需要一个数字来补,>>表示用符号位补
print(a>>>1);//>>>表示用0来补
}
补充
如何通过位运算将正负数互换?
方法:取反加一
public static void main(String[] args) {
int c=5;
int d=(~c+1);
System.out.println(c);
System.out.println(d);
}
值得注意的是,
正数最大值为 2^31-1,
负数最小值为 -2^31,
当负数取最小值,此时不能得到正的最大值,通过取反加一可知
得到的为其本身
public static void main(String[] args) {
int c=Integer.MIN_VALUE;
int d=(~c+1);
System.out.println(c);
System.out.println(d);
}
其实我们的人生也就像位运算那样,简单而又朴实,或许时常左移,时常右移,徘徊不定,但因为不确定才有了存在的意义!