移位运算符
C语言除了提供四种逻辑位运算符之外,还提供了可以将某个变量中所有的二进制位进行左移或右移的运算符。
左移运算符
右移运算符
移位运算符可以和赋值运算符结合
通过移位操作可以改变变量的值
对于整型值来说,左移一位值×2,右移一位值÷2,右移两位÷4,例如:
#include <stdio.h>
int main(void)
{
int value = 1;
while (value < 1024)
{
value <<= 1; // value = value << 1;
printf("value = %d\n", value);
}
printf("\n......woshiyitiaofengexian.......\n\n");
value = 1024;
while (value > 0)
{
value >>= 2;
printf("value = %d\n",value);
}
return 0;
}
移位做乘除效率最高。
一些未定义行为
左移、右移运算符右边的操作数如果是为负数,或者右边的操作数大于左边操作数支持的最大宽度,那么表达式的结果均是属于“未定义行为”。
左边的操作数是有符号还是无符号数其实也对移位运算符有着不同的影响。无符号数肯定没问题,尾音这时候变量里面所有的位都用于表示该数值的大小。但如果是有符号数,那就要区别对待了,因为有符号数的左边第一位是符号位,所以如果恰好这个操作数是个负数,那么移动之后是否覆盖符号我的决定权还是落到了编译器上。
位操作的应用
掩码
if((value & mask) == mask)
{
printf("OPEN!\n");
}
打开位
关闭位
转置位