原码 补码 反码
正整数三者相同 负整数需要计算 权重:
那么接下来看-7 源码: 10000000000000000000000000000111 反码: 11111111111111111111111111111000(符号位不变,其它位按位取反) 补码: 11111111111111111111111111111001(反码+1)
整数在内存中存的是二进制的补码,移位操作符操作的是内存中的二进制数
左移
以左移为例,自左移为<<= 只针对整数 对
右移
取决于编译器
算术移位(msvc,gcc)
右边丢弃,左边补原符号位(正0负1)
逻辑移位
右边丢弃,左边补0
按位与
两个是1才是1
按位或
一个是1就是1
按位异或
相同为0,相异为1
结合律
例:不借助第三个变量交换两个变量的值cpp
a = a ^ b;//a = 3^5
b = a ^ b;//b = 3^5^5 = 0^3 = 3
a = a ^ b;//a = 3^5^3 = 0^5 = 5无进位运算,所以不存在溢出