位操作提高程序运行效率,减少除法和取模的运算。在计算机程序中,数据的位是可以操作的最小数据单位,理论上可以用“位运算”来完成所有的运算和操作。
后空缺自动补0
分为逻辑右移和算数右移
不管什么类型,空缺自动补0
若是无符号数,则空缺补0,若是负数,则空缺补1
位运算符操作的都是整型的数据
<<:在一定范围内,每向左移1位,就相当于*2
>>:在一定范围内,每向右移1位,就相当于/2
左移运算符是一个计算机用语。用来将一个数的各二进制位全部左移若干位,移动的位数由右操作数指定,右操作数必须是非负值,其右边空出的位用0填补,高位左移溢出则舍弃该高位。
左移表达式的位 result = expression1 << expression2
参数 result,任何变量。
expression1,任何表达式。
expression2,任何表达式。
说明:<<运算符把expression1的所有位向左移expression2指定的位数。
按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
需要移位的数字 << 移位的次数
在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1。
需要移位的数字 >> 移位的次数
右移一位相当于除2,右移n位相当于除以2的n次方。这里是取商哈,余 数就不要了。
按二进制形式把所有的数字向右移动对应位数,低位移出(舍弃),高位的空位补零。对于正数来说和带符号右移相同,对于负数来说不同。 其他结构和>>相似。
一元运算符~把1变为0,把0变为1
~a不会改变a的值,但是该运算符确实创建了一个可以使用或者赋值的新值
char a=2;
char b=~a; //a的值不会被改变
a=~a; //改变了a的值
printf("%d",~a);
a的值为00000010,~a的值为11111101
二元运算符&通过逐位比较两个运算对象,生成一个新值。对于每一位,只有两个运算对象中相应的位都为1时,结果才是1
val &=0377;+
val=val & 0377; //二者等价
二元运算符|,通过逐个比较两个运算对象,生成一个新值。对于每个位,如果两个运算对象中相应的位为1,结果就为真
val |= 0377;
val=val | 0377; //二者等价
二元运算符^逐位比较两个运算对象。对于每一位,如果两个运算对象中相应的位一个为1,但不是两个都为1,结果为1
val ^=0377;
val=val^0377; //二者等价
掩码:按位与 &
打开位(设置位) :|
关闭位(清空位):&和~
切换位 :^
检查位的值