c语言-位操作符练习题

文章目录


前言

本篇文章介绍利用c语言的位操作符解决一些练习题,目的是掌握各个位操作符的使用和应用场景。

表1.1为c语言中的位操作符

操作符 含义
& 按位与
| 按位或
^ 按位异或
~ 按位取反(包括符合位)
<< 左移
>> 右移

表1.1 位操作符表

注意:

  1. 位操作符除"~"为单目操作符外,其余均为二目操作符,即有两个操作数
  2. 参加位操作符的对象只能是整型或字符型数据。

一、n&(n-1)的运用场景(n为整数)

题目:求一个整数存储在内存中的二进制位中1的个数(补码中1的个数)

n&(n-1)的过程如下(假设n = 15):

图1.1 n&(n-1)过程图 不断通过n&(n-1),每一次得到的结果是消去最右边的1;
原理:不断地向左借位,然后利用&操作符消去。 代码实现如下:

c 复制代码
int count_2scomplement_3(int num)
{
	int count = 0;
	while (num)
	{
		count++;
		num = num & (num - 1);
	}
	return count;
}

题目:判断一个数是不是2的n次方

这到题依然可以利用n&(n-1)进行解答,如果一个数是2的n次方,则意味只有一个1。如果n&(n-1)的结果为0,那么这个值就是2的n次方。

代码实现如下:

c 复制代码
int main()
{
	int num = 0;
	scanf("%d", &num);

	if (0 == (num & (num - 1)))
		printf("%d is 2^n\n", num);
	else
		printf("%d is not 2^n\n",num);

	return 0;
}

题目:两个int(32位)整数的m和n二进制表达式中,有多少个不同的位

这道题的思路是:m与n进行异或运算后,得到m和n的不同位,即1的个数就是不同位的个数,此时,这题又回到了统计1的个数,即第一题的解法。

代码实现如下:

c 复制代码
int main()
{
	int m = 0;
	int n = 0;
	int ret = 0;
	scanf("%d %d", &m, &n);
	int a = (m ^ n);
	while(a)
	{
		ret++;
		a = a&(a-1);
	}
	printf("%d", ret);
	return 0;
}

二、&1 和 >>的应用场景

利用&1和>>可以统计一个二进中1或者0的个数;

利用&1和>>也可以获得任意一个位的值。

题目:求一个整数存储在内存中的二进制位中1的个数(补码中1的个数)

利用&1和>>进行解题,代码实现如下:

c 复制代码
int count_2scomplement_2(int num)
{
	int count = 0;
	int rightmovetimes = 0;
	for (rightmovetimes = 0; rightmovetimes < 32; rightmovetimes++)
	{
		if ((num >> rightmovetimes) & 1)
		{
			count++;
		}
	}
	return count;
}

num >> rightmovetimes) & 1 == 1,则统计1的个数;为0则统计0的个数。

获取一个整数二进制序列中所有的奇数位和偶数位,分别打印二进制序列

要求:从高位开始打印

这道题的思路依然是利用&1和>>,从高位开始

代码实现如下:

c 复制代码
int main()
{
	int num = 0;
	scanf("%d", &num);
	int i = 0;
	//打印奇数位
	for (i = 30; i >= 0; i -=2 )
	{
		printf("%d", (num >> i) & 1);
	}
	printf("\n");
	//打印偶数位
	for (i = 31; i >= 1; i -= 2)
	{
		printf("%d", (num >> i) & 1);
	}
	return 0;
}

总结

本篇文章叙述了n&(n-1)和&1、>>的应用场景。

相关推荐
十重幻想1 小时前
PTA6-1 使用函数求最大公约数(C)
c语言·数据结构·算法
脑子慢且灵2 小时前
C语言与Java语言编译过程及文件类型
java·c语言·开发语言·汇编·编辑器
蒙奇D索大2 小时前
【C语言加油站】C语言文件操作详解:从“流”的概念到文件的打开与关闭
c语言·开发语言·笔记·学习·改行学it
小此方3 小时前
C语言自定义变量类型结构体理论:从初见到精通(上)
c语言·开发语言
胖咕噜的稞达鸭5 小时前
C++中的父继子承:继承方式实现栈及同名隐藏和函数重载的本质区别, 派生类的4个默认成员函数
java·c语言·开发语言·数据结构·c++·redis·算法
一碗绿豆汤5 小时前
c语言-运算符
c语言
一碗绿豆汤7 小时前
C语言--核心语法
c语言
七饭7 小时前
C语言数据结构-排序
c语言·数据结构·排序算法
老侯(Old monkey)11 小时前
C语言:冒泡法排序
c语言·函数调用·指针·冒泡法排序
迎風吹頭髮15 小时前
UNIX下C语言编程与实践58-UNIX TCP 连接处理:accept 函数与新套接字创建
c语言·网络·unix