C语言 位移运算符的使用

<< 运算符 和 >> 运算符的作用是求出将整数中的所有位左移或右移之后生成的值。

<< 运算符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 被用于执行这一工作。

总结:

  1. 使用 << 运算符进行左移
    表达式 x << n 会将x的所有位左移 n 位,并在右边空出的位(低位)上补0。二进制的每一位都是2的指数幂,所以左移 1 位后,只要没有发生数据溢出,值就会变为原来的2倍。

  2. 使用 >> 运算符进行右移
    表达式 x >> n 会将x的所有位右移n位。二进制数右移 1 位后,值会变为原来的二分之一。

  3. 当 x 时有符号整型的复数是,位移运算的结果因编译器而异。在许多编译器中,会执行逻辑位移或算术位移。

注:虽然可以对负数进行位移,对一个数做负数位移位的操作是不规范的,所以最好不要对负数进行位移。
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值