<< 运算符 和 >> 运算符的作用是求出将整数中的所有位左移或右移之后生成的值。
<< 运算符 | a << b | 将 a 左移 b 位。右面空出的位用0填充 |
>>运算符 | a >>b | 将a右移b位 |
注:这些运算符的操作数必须是整数类数据类型或枚举型
#include <stdio.h>
int count_bits(unsigned x){
int count = 0;
while(x) {
if (x & 1U) {
count++;
}
x >>= 1;
}
return count;
}
int int_bits(void){
return count_bits(~0U);
}
void print_bits(unsigned x){
int i ;
for (i = int_bits() - 1; i >= 0; i--){
putchar(((x >> i) & 1U) ? '1' : '0');
}
}
int main(void){
unsigned num1, n;
printf("非负整数:");
scanf("%u", &num1);
printf("位移位数:");
scanf("%u", &n);
printf("\n整数转换为2进制 = ");
print_bits(num1);
printf("\n整数左移后的值 = ");
print_bits(num1 << n);
printf("\n整数右移后的值 = ");
print_bits(num1 >> n);
putchar('\n');
return 0;
}
运行结果:
- count_bits函数:功能是计算形参 x 所接收到的无符号整数中有多少个值为1的二进制位,并返回其个数。
1U(只有低位为1的无符号整数)和x的逻辑与运算,判断x的低位是否为1。如果低位为1,则bits递增。 - int_bits函数:返回int型和unsigned型的位数。
~0U是所有位都为 1 的unsigned 型整数(将所有位都为0的无符号整数0U的所有位反转得到)。 - print_bits函数: 将unsigned型整数的高位到地位的所有位都用1 和 0来显示的函数。
函数 print_bits 是将无符号整数 x 的所有位有用 0 和 1 来表示的函数。函数 int_bits 和 count_bits 被用于执行这一工作。
总结:
-
使用 << 运算符进行左移
表达式 x << n 会将x的所有位左移 n 位,并在右边空出的位(低位)上补0。二进制的每一位都是2的指数幂,所以左移 1 位后,只要没有发生数据溢出,值就会变为原来的2倍。 -
使用 >> 运算符进行右移
表达式 x >> n 会将x的所有位右移n位。二进制数右移 1 位后,值会变为原来的二分之一。 -
当 x 时有符号整型的复数是,位移运算的结果因编译器而异。在许多编译器中,会执行逻辑位移或算术位移。
注:虽然可以对负数进行位移,对一个数做负数位移位的操作是不规范的,所以最好不要对负数进行位移。