- 写一个函数返回参数二进制中 1 的个数
比如: 15 0000 1111 4 个 1
#include<stdio.h>
#include<stdlib.h>
int One_Number(int n) {
int count = 0;
for (int i = 0; i <sizeof(int)*8; i++) {
//按位与,只有两个都为1结果才为1
if ((n&1) == 1) {
count++;
}
//n右移一位
n= n>> 1;
}
return count;
}
int main() {
int n = 100;
printf("%d\n", One_Number(n));
system("pause");
return 0;
}
- 获取一个数二进制序列中所有的偶数位和奇数位,
分别输出二进制序列。
#include<stdio.h>
#include<stdlib.h>
void every_number(int k) {
int n = k; //记下参数
//求奇数位
//利用按位与即可得到每一位
printf("奇数位:");
for (int i = 0; i <sizeof(int)*8; i+=2) {
printf("%d",(k&1));
k=(k >> 2);
}
printf("\n");
//求偶数位
printf("偶数位:");
n = n >> 1;
for (int j = 0; j <sizeof(int)*8; j+=2) {
printf("%d", (n & 1));
n = n >> 2;
}
}
int main() {
int k =22;
every_number(k);
printf("\n");
system("pause");
return 0;
}
- 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
输入例子:
1999 2299
输出例子:7
#include<stdio.h>
#include<stdlib.h>
int Different_Count(int n1, int n2) {
int count = 0;
for (int i = 0; i <sizeof(int)*8; i++) {
if ((n1 & 1) != (n2 & 1)) {
count++;
}
n1=n1 >> 1;
n2=n2 >> 1;
}
return count;
}
int main() {
int n1 = 1999, n2 = 2299;
printf("%d\n", Different_Count(n1, n2));
system("pause");
return 0;
}
- 编写函数:
unsigned int reverse_bit(unsigned int value);
这个函数的返回值value的二进制位模式从左到右翻转后的值。
如:
在32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后:(2550136832)
10011000000000000000000000000000
程序结果返回:
2550136832
#include<stdio.h>
#include<stdlib.h>
unsigned int reverse_bit(int n) {
unsigned int k = 0;
int a[32] = { 0 };
for (int j = 0; j < 32; j++) {
k = k << 1; //将最后一位左移
k= k|((n >>j) & 1); //获取n的每一位,并将其赋给k的最后一位
}
return k;
}
int main() {
int n = 25;
printf("%u\n", reverse_bit(n));
system("pause");
return 0;
}
- 不使用(a+b)/2这种方式,求两个数的平均值。
//右移一位相当于除2的一次方,左移相当于乘2的1次方
#include<stdio.h>
#include<stdlib.h>
int average(int a, int b) {
int c = 0;
c = (a + b) >> 1;
return c;
}
int main() {
int a = 15, b = 17;
printf("%d\n", average(a, b));
system("pause");
return 0;
}
- 一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。
请找出这个数字。(使用位运算)
#include<stdio.h>
#include<stdlib.h>
int main() {
int a[] = { 1,2,3,1,2,3,4 };
//按位异或,相同为0,不同为1
for (int i = 1; i < sizeof(a) / sizeof(int); i++) {
a[0] = a[0] ^ a[i];
}
printf("%d\n", a[0]);
system("pause");
return 0;
}