最近写了几道位运算的题目,顺便复习一下位运算的基本知识。
反码:将二进制的所有值取反,0变成1,1变成0
补码:反码加一
二进制转换
正常情况下,我们可以用Integer.toBinaryString()来获取一个负数的二进制字符串,但是将二进制字符串转换为Integer时Integer.valueOf("1010", 2)就只能转正整数,负数是无法转换的。要想转换二进制为负数,得用new BigInteger("二进制字符串", 2).intValue();
我们都知道一个int有8个字节,32位,但是最左边的那个位置是用来表示正负符号的,也就是说Integer.MAX_VALUE所代表的值二进制是:0111 1111 1111 1111 1111 1111 1111 1111而1111 1111 1111 1111 1111 1111 1111 1111代表的是-1。
位运算
我们都知道移位运算符有三个:>> / << / >>> ;其中>>>叫做无符号右移,有什么区别?
Integer.toBinaryString(Integer.MAX_VALUE << 1);--> -2
正常情况下:左移右移的规则是左边多的去掉,右边多的也是去掉,右边少的补0,负数左边少了是补1,正数左边少了是补0。所以有个无符号右移,为的就是这个。>>>无符号右移左边缺了是不管正负数直接补0。
n &= n-1 会把n的二进制最后一个1换成0,所以广泛用于计算二进制串有多少个1的算法