在了解这些操作符之前,我们首先应该了解什么是原码,反码,补码。
1,原码,反码,补码
原码:就是直接将正负数翻译成二进制的形式。
补码:符号位不变,对原码取反。
补码:对补码加一。
注意:对于正整数来说,他的原码,反码,补码都相等。
注意:数据的补码储存于内存之中,并且在运算时运用的也是补码,只有在打印时运用的才是补码
2,移位操作符
1,左移操作符(<<)
移位规则:左边抛弃,右边补0。
对于大部分整数来说,左移相当于乘2。
2,右移操作符(>>)
移位规则:1,算术右移:右边抛弃,左边补符号位。(通常使用的算术右移)
2,逻辑右移:右边抛弃,左边补0。
对于大部分整数来说,右移相当于除以2。
3,注意
不要移动负数位,这个行为是未定义的。
2,位操作符
1,与操作符&(有0为0,都1为1)
eg:计算二进制中1的个数
int main()
{
int a = 10;
int count = 0;
while (a)
{
count++;
a = a & (a - 1);//每进行一次去掉一个1
}
printf("%d", count);
return 0;
}
2,或操作符|(有1为1,都0为0)
3,异或操作符^(相同为0,相异为1)
eg:在不使用第三个变量的情况下,交换两个数的值。
int main()
{
int a = 10;
int b = 20;
a = a ^ b;
b = a ^ b;//b=a^b^b==a^0==a
a = a ^ b;//a=a^b^a==b^0==b
printf("%d %d", a, b);
return 0;
}
4,取反操作符~(全部取反)
eg:将13⼆进制序列的第5位修改为1,然后再改回0
int main()
{
int a = 13;
//00001101
//00011101 29
a = a | (1 << 4);
//00011101 a
//00010000 (1<<4)
//11101111 ~(1<<4)
a = a & ~(1 << 4);
printf("%d", a);
return 0;
}
3,逗号表达式
从左到右依次进行,取最后一个的值为表达式的值