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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小赵小赵福星高照~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值