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;
}
方法二求解思路:
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;
}
打印整数二进制的奇数位和偶数位
解题思路:
唯一需要注意的是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;
}
欢迎大家学习交流,有任何不懂之处请在评论区留言
以上是关于C语言有关移位操作符位操作符的习题讲解的主要内容,如果未能解决你的问题,请参考以下文章