负数的表示
计算机中负数的表示,是以补码的形式呈现的。
- 原码
一个正数,按照绝对值大小转换成的二进制数;一个负数按照绝对值大小转换成的二进制数,然后最高位补1,称为原码。 - 反码
正数的反码与原码相同,负数的反码为对该数的原码除符号位外各位取反。 - 补码
正数的补码与原码相同,负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1。
负数的二进制转换十进制
最后一位-1,除符号位以外,其余位取反。
位运算简介
描述 | 符号 | 说明 |
---|---|---|
按位与 | & | 任何数和0按位与都是0(1&1=1、0&0=0、1&0=0) |
按位或 | | | 任何数和0按位或都是1(1|1=1、0|0=0、1|0=1) |
按位非 | ~ | ~1=0、~0=1 |
按位异或 | ^ | 任何数自己按位异或都是0(1^1=0 、1^0=1、0^0=0) |
有符号左移 | << | 左移操作时将运算数的二进制码整体左移指定位数,左移之后的空位用0补充,高位溢出 |
有符号右移 | >> | 右移操作是将运算数的二进制码整体右移指定位数,右移之后的空位用符号位补充,如果是正数用0补充,负数用1补充,低位溢出 |
无符号右移 | >>> | 右移操作是将运算数的二进制码整体右移指定位数,右移之后的空位用符号位补充,不论正负,高位均补0,低位溢出 |
应用场景举例
两个数字交换
a=a^b;
b=a^b;
a=a^b;
判断是否是偶数
if(0 == (a & 1)) {
//偶数
}
if(1 == (a & 1)) {
//奇数
}
取模操作
a%(2n) ==> a&(2n-1)
实现数字翻倍或减半
a >>1 ==> a%2
a <<1 ==> a*2