C语言有关移位操作符位操作符的习题讲解

Posted 小赵小赵福星高照~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言有关移位操作符位操作符的习题讲解相关的知识,希望对你有一定的参考价值。

统计二进制中1的个数

方法一求解思路:

1.二进制中的每一位按位与1得到的结果该位数本身

#include<stdio.h>
int countone(int n)
{
    int i = 0;
    int count = 0;
    for (i = 0; i < 32; i++)
    {
        if (((n >> i) & 1 )== 1)
            count++;
    }
    return count;
}
int main()
{
    int a = 0;
    printf("请输入你要统计二进制中1的个数的十进制数:");
    scanf("%d", &a);
    printf("%d\\n", countone(a));
    return 0;
}

image-20210521083856754

方法二求解思路:

1.n&(n-1)将n的最后一位为1的删除

2.n&(n-1)等于0之前执行的次数就为1的个数

#include<stdio.h>
int countone(int n)
{
    int count = 0;
    while(n>0)
    {
        n=n&(n-1);
        count++;
    }
    return count;
}
int main()
{
    int a = 0;
    printf("请输入你要统计二进制中1的个数的十进制数:");
    scanf("%d", &a);
    printf("%d\\n", countone(a));
    return 0;
}

求两个数二进制中不同位的个数

方法一求解思路:

1.按位异或操作符:相同为0,不同为1,所以我们将两个数异或,c=a^b

2.将求解转换为求解c的二进制中的1个个数

#include<stdio.h>
int countone(int n)
{
    int count = 0;
    while (n > 0)
    {
        n = n & (n - 1);
        count++;
    }
    return count;
}
int main()
{
    int a = 0;
    int b = 0;
    scanf("%d %d", &a, &b);
    int c = a ^ b;
    printf("%d和%d二进制中不同位的个数为%d:",a, b, countone(c));
    return 0;
}

方法二求解思路:

1.二进制中的每一位按位与1得到的结果该位数本身

2.比较两个数的二进制位的各个位,不相等,则计数++

#include<stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	int count = 0;
	scanf("%d", &a);
	scanf("%d", &b);
	int i = 0;
	for (i = 0; i < 32; i++)
	{
		if (((a >> i) & 1) != ((b >> i) & 1))
		{
			count++;
		}
	}
	printf("%d\\n", count);
	return 0;
}

交换两个变量(不创建临时变量)

求解思路:

a^b^b=a

a^b^a=b

#include<stdio.h>
int main()
{
	int a = 10;
	int b = 20;
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	printf("a=%d b=%d\\n", a, b);
	return 0;
}

image-20210521085656436

打印整数二进制的奇数位和偶数位

解题思路:

唯一需要注意的是for循环中i的起始值和判断部分,和调整部分。

#include<stdio.h>
int main()
{
	int a = 15;
	//00000000000000000000000000001111
	printf("奇数位:");
	int i = 1;
	for (i = 31; i >=1; i -= 2)
	{
		printf("%d ", (a >> i) & 1);
	}
	printf("\\n");
	printf("偶数位:");
	for (i = 30; i >= 0; i -= 2)
	{
		printf("%d ", (a >> i) & 1);
	}
	return 0;
}

image-20210521090125843

欢迎大家学习交流,有任何不懂之处请在评论区留言

以上是关于C语言有关移位操作符位操作符的习题讲解的主要内容,如果未能解决你的问题,请参考以下文章

C语言操作符和表达式详细讲解

C语言深度剖析深入理解C语言中的移位操作符(代码+图解)

C语言☀️操作符详解☀️(详细讲解+代码演示+图解)

C语言左移位符号 << 结合 =| 实现置位操作

详细讲解 —— 操作符(C语言初阶)(万字长文)

总结——C语言操作符。