目录
编辑
原码、反码、补码
1、正数
2、负数
3、二进制计算1-1
移位操作符
1、<<左移操作符
2、>>右移操作符
位操作符&、|、^、~
1、&按位与
2、|按位或
3、^按位异或
特点
4、~按位取反
原码、反码、补码
1、正数
原码 反码 补码相同,最高位为符号位,0正1负
例:10的原码 反码 补码如下(32位二进制表示)
00000000000000000000000000001010 原码 反码 补码
2、负数
原码 变 反码:符号位不变,其他位取反
反码 变 补码:反码+1
其中 原码和补码的相互转换方法一致 符号位不变,其他位取反,再+1
例:-10的原码 反码 补码如下
10000000000000000000000000001010 原码
11111111111111111111111111110101 反码
11111111111111111111111111110110 补码
3、二进制计算1-1
我们都知道1-1=1+(-1)=0,计算机计算是利用补码的
00000000000000000000000000000001 1的原码
10000000000000000000000000000001 -1的原码
11111111111111111111111111111110 -1的反码
11111111111111111111111111111111 -1的补码
1和-1的补码相加得
100000000000000000000000000000000 33位,多的一位向左边移动
00000000000000000000000000000000 1-1的结果 0
移位操作符
注意:1.操作数只能是整数,移动的是补码
2.不能移动负数位(如n>>-1)
1、<<左移操作符
移位规则:左移抛弃,右移补0
如图将n=10左移1位,以下展示左移细节
00000000000000000000000000001010 n 10(补码)
00000000000000000000000000001010 左移之后
00000000000000000000000000010100 m 20 左边的0舍弃,右边补0
2、>>右移操作符
移位规则:有逻辑右移和算数右移两种
1.逻辑右移:左边补0,右边丢弃
如图将n=10逻辑右移1位,以下展示右移细节
00000000000000000000000000001010 n 10(补码)
00000000000000000000000000001010 右移之后
00000000000000000000000000000101 m 5 左边补0,右边的0舍弃
2.算数右移:左边用原符号位填充,右边丢弃(VS中默认算数右移)
如图将n=10算数右移1位,以下展示右移细节
11111111111111111111111111110110 n -10(补码)
11111111111111111111111111110110 右移之后
11111111111111111111111111111011 m 5 左边补1,右边的0舍弃
位操作符&、|、^、~
注意:操作数只能是整数,操作的都是二进制位
1、&按位与
运算规则:补码对应的二进制位进行“与”运算,即有0则为0,同为1则为1,可以理解为乘法。
如图将a&b,以下展示细节
00000000000000000000000000000011 a 3的补码
11111111111111111111111111111011 b -5的补码
00000000000000000000000000000011 c a&b的补码
00000000000000000000000000000011 c的原码 3
2、|按位或
运算规则:补码对应的二进制位进行“或”运算,即有1则为1,同为0则为0,可以理解为加法。
如图将a|b,以下展示细节
00000000000000000000000000000011 a 3的补码
11111111111111111111111111111011 b -5的补码
11111111111111111111111111111011 c a|b的补码
10000000000000000000000000000101 c的原码 -5
3、^按位异或
运算规则:补码对应的二进制位进行“异或”运算,即相同为0,相异为1。
如图将a^b,以下展示细节
00000000000000000000000000000011 a 3的补码
11111111111111111111111111111011 b -5的补码
11111111111111111111111111111000 c a^b的补码
10000000000000000000000000001000 c的原码 -8
特点
a^a=0
a^0=a
4、~按位取反
运算规则:补码对应的二进制位进行“取反”运算,即1变为0,0变为1。
如图b=~a,以下展示细节
00000000000000000000000000000001 a 1的补码
11111111111111111111111111111110 b ~a的补码
10000000000000000000000000000010 b的原码 -2