C语言中基本的位操作符有 左移、右移、按位与、按位或、按位异或、取反)
我们用表格先归总一下
名称 | 符号 | 运算规则 |
---|---|---|
左移 | << | 高位丢弃,低位补0 |
右移 | >> | 对无符号数,高位补0. 对有符号数,算数右移高位补符号位,逻辑右移高位补0 |
按位与 | & | 两位同为“1”,结果才为“1”,否则为0 |
按位或 | l | 两位只要有一个“1”,结果就为“1”,否则为0 |
按位异或 | ^ | 两位 同“0”异“1” |
取反 | ~ | “1”变“0”,“0”变“1” |
下面来结合代码说明
**1.左移 << **
int num = 10;
num = num << 1;
printf("%d",num);
所以左移几位就是原数乘2的n次方
**2.右移 >> **
右移运算分两种(因为数在内存中以补码形式存储的):
- 逻辑右移 :不考虑符号位,高位补0,低位溢出的丢弃
- 算术右移:考虑符号位,高位用原该值的符号位填充,低位溢出的丢弃
int num1 = 10; //二进制 00000000 00000000 00000000 00001010
num1 = num1 >> 1; //右移1位 00000000 00000000 00000000 00000101
int num2 = -10; //二进制 11111111 11111111 11111111 11110110
num2 = num2 >> 1; //右移1位 11111111 11111111 11111111 11111011
printf("%d %d\n", num1,num2); //num1 = 5 ,num2 = -5
ps:对于移位运算符,不要移动负数位,这个是标准未定义的
例: