C语言中移位、逻辑运算符的简单应用
一、 计算二进制中1 的个数比如: 15 0000 1111 4 个 1
要求其数字的存储方式为int
int count_one_bits(unsigned int value)//计算1的位数函数
{
int count;
count=0;
while(value)
{
count++;
value=value&(value-1);//每&一次,减少一个二进制数中的“1”的个数;
}
return count;
}
&运算符和>>运算符的联合应用
二、获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,j;
int num;//定义输入变量
int a[16],b[16];//定义存放奇数位和偶数位的数组
printf("请输入一个十进制数字:");
scanf("%d",&num);
for (i = 0 ,j = 0; j < 32; i++, j=j+2) //获取二进制数列的奇数位
{
a[15-i] = ( num>>j )&1;
}
printf("从高位到低位奇数位分别为:");
for (i = 0; i < 16; i++) //从高位到低位输出其二进制奇数位
{
printf("%d ",a[i]);
}
for (i = 0 ,j = 1; j < 32; i++, j=j+2) //获取二进制数列的偶数位
{
b[15-i] = ( num>>j )&1;
}
printf("\n从高位到低位偶数位分别为:");
for (i = 0; i < 16; i++) //从高位到低位输出其二进制偶数位
{
printf("%d ",b[i]);
}
system("pause");
return 0;
}
| 运算符
三、判断名次是否连续
/*将名次对应一个数中的二进制位*/
int ret = 0, flag = 0; ret |= (1 << (a - 1)); ret |= (1 << (b - 1)); ret |= (1 << (c - 1)); ret |= (1 << (d - 1)); ret |= (1 << (e - 1)); while (ret) { if (0 == ret % 2) { flag = 1; } ret / = 2; } if (0 == flag) { printf("比赛的名次为:\n"); printf("a=%d\nb=%d\nc=%d\nd=%d\ne=%d\n", a, b, c, d, e); } 四、寻找两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同 int different_bits(int num_1, int num_2) { int count = 0; for (int i = 0; i < 32; i++) { if (((num_1 >> i) & 1) ^ ((num_2 >> i) & 1)) { count++; } } return (count); }
五、将一个无符号数的二进制数逆置
unsigned int reverse_bit(unsigned int num)
{
int i = 0;
unsigned int ret = 0;
for (i = 0; i < 32; i++)
{
ret<<=1;
ret |= ((num >> i) & 1);
}
return (ret);
}
六、求两个数的平均值,无溢出
int average(int a, int b)
{
return((a & b) + ((a ^ b) >> 1));
}
七、找出一组数据中单独出现的数字
int find_only(int arr[], int size)
{
for (int i = 1; i < size; i++)
{
arr[0] ^= arr[i];
}
return (arr[0]);
}
上一篇: C++基础实例-文件Io等(5)