路一:使用 %2 和 /2 取出每一位并判断
总体思路:
(一). 创建函数,参数要设置成无符号整数,设置计数器计算1的个数
(二). 使用 while循环 循环判断二进制每一位,
使用 %2 判断最低位是否为 1,
使用 /2 去掉判断了的最低位,下次循环开始判断新的最低位
第一步:
(1). 创建函数number_of_1 ,
返回值为 int -- 返回计数器,
函数参数为 unsigned int m -- 要设置成无符号整数,不然无法判断负数,
因为有符号整数的最高位是符号位,不是有效数字
(2). 设置 计数器count -- 统计 函数参数二进制中 1 的个数
实现代码:
#include <stdio.h> //创建函数: int number_of_1(unsigned int m) { //设置 计数器count : int count = 0; } int main() { return 0; }
实现图片:
第二步:
(1). 使用 while循环 循环判断二进制每一位
(2). 使用 %2 判断 最低位是否为1,是则 count++
(3). 使用 /2去掉判断了的最低位,下次循环开始判断新的最低位
(4). 循环结束后返回计数器count
实现代码:
#include <stdio.h> //创建函数: int number_of_1(unsigned int m) { //设置 计数器count : int count = 0; //使用 while循环 : while (m) //如果 m 不为0,说明二进制中还有1 { if (m % 2 == 1) //使用 %2 判断最低位是否为1 { count++; //是则 count++ } m /= 2; //去掉二进制最低位 } //放回 计数器 : return count; } int main() { return 0; }
实现图片:
第三步:
编写主函数:
(1). 输入要判断的数字
(2). 调用函数 number_of_1
(3). 打印结果
实现代码:
#include <stdio.h> //创建函数: int number_of_1(unsigned int m) { //设置 计数器count : int count = 0; //使用 while循环 : while (m) //如果 m 不为0,说明二进制中还有1 { if (m % 2 == 1) //使用 %2 判断最低位是否为1 { count++; //是则 count++ } m /= 2; //去掉二进制最低位 } //放回 计数器 : return count; } //编写主函数: int main() { //输入要判断的数字: int n = 0; scanf("%d", &n); //调用函数: int ret = number_of_1(n); //打印结果: printf("%d\n", ret); return 0; }
实现图片:
思路一:最终代码和实现效果
最终代码:
#include <stdio.h> //创建函数: int number_of_1(unsigned int m) { //设置 计数器count : int count = 0; //使用 while循环 : while (m) //如果 m 不为0,说明二进制中还有1 { if (m % 2 == 1) //使用 %2 判断最低位是否为1 { count++; //是则 count++ } m /= 2; //去掉二进制最低位 } //放回 计数器 : return count; } //编写主函数: int main() { //输入要判断的数字: int n = 0; scanf("%d", &n); //调用函数: int ret = number_of_1(n); //打印结果: printf("%d\n", ret); return 0; }
实现效果:
思路二:使用 移位操作符 和 位操作符 进行判断
总体思路:
在 思路一 的基础上 修改 第二步:
使用 for循环 ,因为有32位二进制位,循环32次
使用 移位操作符>> 和 按位与&判断 最低位二进制是否为1
修改思路一第二步:
(1). 使用 for循环 ,因为有32位二进制位,循环32次
(2). 使用 移位操作符>> 和 按位与&判断 最低位二进制是否为1,是则count++
实现代码:
#include <stdio.h> //创建函数: int number_of_1(unsigned int m) { //设置 计数器count : int count = 0; //使用 for循环 : int i = 0; for (i = 0; i < 32; i++) //因为有32位二进制位,循环32次 { //使用 移位操作符>> 和 按位与& 判断最低位: if (((m >> i) & 1) == 1) //移动 i位 后再 按位与1,判断最低位 //移动后 m 的值并没有变,所以可以一直移动 { count++; //是 1 则计数++ } } //放回 计数器 : return count; } //编写主函数: int main() { //输入要判断的数字: int n = 0; scanf("%d", &n); //调用函数: int ret = number_of_1(n); //打印结果: printf("%d\n", ret); return 0; }.
实现图片:
思路二:最终代码和实现效果
最终代码:
#include <stdio.h> //创建函数: int number_of_1(unsigned int m) { //设置 计数器count : int count = 0; //使用 for循环 : int i = 0; for (i = 0; i < 32; i++) //因为有32位二进制位,循环32次 { //使用 移位操作符>> 和 按位与& 判断最低位: if (((m >> i) & 1) == 1) //移动 i位 后再 按位与1,判断最低位 //移动后 m 的值并没有变,所以可以一直移动 { count++; //是 1 则计数++ } } //放回 计数器 : return count; } //编写主函数: int main() { //输入要判断的数字: int n = 0; scanf("%d", &n); //调用函数: int ret = number_of_1(n); //打印结果: printf("%d\n", ret); return 0; }
实现效果:
思路三:
使用m = m & (m - 1) -- 这个表达式会让n的二进制中最右边的1消失
总体思路:
在 思路一 的基础上 修改 第二步:
使用 while循环 ,如果m不为0,则m的二进制中还有1
使用 m = m & (m - 1),去掉m的二进制中最右边的1,再赋给m,以便下次循环判断
去掉一个1时,计数器++
修改思路一第二步:
(1). 使用 while循环 ,如果m不为0,则m的二进制中还有1
(2). 使用 m = m & (m - 1),去掉m的二进制中最右边的1,再赋给m,以便下次循环判断
去掉一个1时,计数器++
实现代码:
#include <stdio.h> //创建函数: int number_of_1(unsigned int m) { //设置 计数器count : int count = 0; //使用 while循环: while (m) //如果m不为0,则m的二进制中还有1 { //使用公式: m = m & (m - 1); //去掉最右边的1 count++; //计数器++ } //放回 计数器 : return count; } //编写主函数: int main() { //输入要判断的数字: int n = 0; scanf("%d", &n); //调用函数: int ret = number_of_1(n); //打印结果: printf("%d\n", ret); return 0; }
实现图片:
思路三:最终代码和实现效果
最终代码:
#include <stdio.h> //创建函数: int number_of_1(unsigned int m) { //设置 计数器count : int count = 0; //使用 while循环: while (m) //如果m不为0,则m的二进制中还有1 { //使用公式: m = m & (m - 1); //去掉最右边的1 count++; //计数器++ } //放回 计数器 : return count; } //编写主函数: int main() { //输入要判断的数字: int n = 0; scanf("%d", &n); //调用函数: int ret = number_of_1(n); //打印结果: printf("%d\n", ret); return 0; }
实现效果: