求一个整数存储在内存中的二进制中1的个数
求一个整数存储在内存中的二进制中1的个数
1.
函数中的参数必须转化为无符号数,否则无法计算负整数在内存中存储的二进制中1的个数。
#include<stdio.h>
int search_one(unsigned int n)//将负数转化为无符号数
{
int count = 0;
while (n)
{
if(n % 2 == 1)
count++;
n /= 2;
}
return count;
}
int main()
{
int n;
scanf("%d", &n);
int ret = search_one(n);
printf("%d\n", ret);
return 0;
}
2.
& - 按位与(二进制位)--对应的二进制位只要有一个是0则为0,两个是1才为1
n&1==1则最低位一定为1
#include<stdio.h>
int main()
{
int n, count = 0;
scanf("%d", &n);
for (int i = 0;i < 32;i++)
{
if (((n >> i) & 1) == 1)
{
count++;
}
}
printf("%d\n", count);
return 0;
}
3.此方法效率更高
计算一个整数二进制中1的个数可采用 - num = num & (num - 1)
#include<stdio.h>
int main()
{
int n, count = 0;
scanf("%d", &n);
while (n)
{
count++;
n = n & (n - 1);
}
printf("%d", count);
return 0;
}
求二进制中不同位的个数
求二进制中不同位的个数,两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同
#include<stdio.h>
int get_diff_bit(int m, int n)
{
int count = 0;
int k = m ^ n;
while (k)
{
k = k & (k - 1);
count++;
}
return count;
}
int main()
{
//异或 - 对应的二进制位相同则为0,相异则为1
int m, n;
scanf("%d %d", &m, &n);
int ret = get_diff_bit(m, n);
printf("%d\n", ret);
return 0;
}
打印二进制的奇数位和偶数位
获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
分别移动到这个数的奇数位(偶数位)并按位与1,若是奇数就会打印1,若是偶数就会打印0。
#include<stdio.h>
void print(int n)
{
int i = 0;
printf("奇数位: ");
for (i=30;i>=0;i-=2)
{
printf("%d ", (n >> i) & 1);
}
printf("\n");
printf("偶数位: ");
for (i=31;i>=1;i-=2)
{
printf("%d ", (n >> i) & 1);
}
printf("\n");
}
int main()
{
int n;
scanf("%d", &n);
print(n);
return 0;
}