题目一 写一个函数返回参数二进制中 1 的个数 比如: 15 0000 1111 4 个 1 程序原型: int count_one_bits(unsigned int value) { // 返回 1的位数 }
- 分析
题目可以看出,我们需要先将十进制数转化为二进制一位一位与1比较 - 思路
通常我们使用while循环,将十进制转换为二进制,然后判断其位数是否为1,为1则count++
不过如果遇到负数,那么就会出现问题,所以我们使用for循环32位,根据判断 value & (1 << i) (全1为1)则count++ - 实现
int count_one_bits(unsigned int value) { int count = 0; for (int i = 0; i < 32; i++) { if (value & (1 << i)) { count++; } } return count; }
题目二 获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
- 分析
需要转换为二进制 - 思路
while循环以实现,得出二进制的位数
for循环与上题相同,增加判断位数奇偶
(tmp >= 0) ? count : 32 正负判断,负数左边全为1 - 实现
void bitSplit(int value) { int tmp = value; int count = 0; while (value != 0) { int temp = value % 2; value = value / 2; count++; } for (int i = 0; i < ((tmp >= 0) ? count : 32); i++) { if (i % 2 == 0) { printf("偶数位%d\n", (tmp & (1 << i)) ? 1 : 0); } else { printf("奇数位%d\n", (tmp & (1 << i)) ? 1 : 0); } } }
题目三 输出一个整数的每一位
- 分析
需要转换为二进制 - 思路
while循环以实现,得出二进制的位数
for循环与上题相同
(tmp >= 0) ? count : 32 正负判断,负数左边全为1 - 实现
void printBit(int value) { int tmp = value; int count = 0; while (value != 0) { int temp = value % 2; value = value / 2; count++; } for (int i = 0; i < ((tmp >= 0) ? count : 32); i++) { printf("%d\n", (tmp & (1 << i)) ? 1 : 0); } }
题目四 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同? 输入例子: 1999 2299 输出例子:7
- 分析
二进制每位对比 - 思路
if ((m & (1 << i)) != (n & (1 << i))) { //判断是否对应位是否相同 count++; }
- 实现
int compareBit(int m, int n) { int count = 0; for (int i = 0; i < 32; i++) { if ((m & (1 << i)) != (n & (1 << i))) { count++; } } return count; }
写在最后
最近推出了公众号 coding趣谈,一位在读学生的技术提升之路,为您提供一系列我在学习路上的笔记,经验,以及感悟。往与君共勉,共同进步! 欢迎大家来关注哦!