位运算符 | 符号表示 | 定义 | 运算结果 |
---|---|---|---|
按位非 | ~ | 单数操作,0变1,1变0 | |
按位或 | | | 两个二进制数相同位只要有一个为1就为1 | 取大运算(结果不会小于最大的那个数) |
按位与 | & | 同1才1 | 取小运算(结果不会大于最小的那个数) |
按位异或 | ^ | 相同为0不同为1,00为1,11为1 | 结果大小无规律 |
>> | 有符号右移 | 二进制数右移n位,左边填充符号位上的数字 | 除以 2n |
>>> | 无符号右移 | 二进制数右移n位,左边统统填充0 | 除以 2n |
<< | 有符号左移 | 二进制数右移n位,右边填充0 | 乘以 2n |
java中不存在无符号左移
最高位代表符号位,0代表正数,1代表负数
位运算符主要针对两个二进制数的位进行逻辑运算,计算机存储的都是补码, 参与运算的也是补码但是正数的补码跟原码反码是一样的,对于负数来说原码所代表的才是真值
8位的(-11)-1011的原码为10001011最高位为符号位
反码为:除符号位外源码取反11110100
补码为源码除符号位外取反加1:11110101
补码变原码 除符号位外取反加1
反码变源码除符号位所有位取反
反码加1变补码
比如-11+1就是11110101+00000001=10001010最高位为1,结果为负数,转换为原码就是10001010(10)
-11+12就是11110101+10001100=00000001最高位为0,结果为正数表示1
当给定一个数时,我们需要求大于它而且最接近他的2的n次方所代表的数
十进制 | 二进制 |
---|---|
8 | 1000 |
16 | 10000 |
32 | 100000 |
public int change(int num)
{
i=num;
i--;//避免传过来的数为$2^n$
//1+2+4+8+16=31
i|=i>>>1;
i|=i>>>2;
i|=i>>>4;
i|i=>>>8;
i|=i>>>16;
return i;
}