/***********************************************************************
目的:统计一个整数的二进制补码中的有几个1
分析:
▶ 对于一个十进制整数要得到它的每一位十进制数需要不断的 %10 和 /10
▶ 对于一个十进制整数要得到它的每一位二进制数(补码)需要不断的 %2 和 /2
平台:Visual studio 2017 && windows
*************************************************************************/
📝 实现代码Numberof1:
#include<stdio.h> int Numberof1(int n) { int count = 0; while(n) { if(n % 2 == 1) { count++; } n /= 2; } return count; } int main() { int n = 15; int ret = Numberof1(n); printf("%d\n", ret); return 0; }
❓❔ Numberof1能否统计负整数二进制中的1
📐 验证如下:
/***********************************************************************
目的:解决Numberof1函数不能统计负整数二进制中的1的问题
分析:
▶ 方法1,在传参的时候,形参的类型使用unsigned int来接收即可
▶ 方法2,使用按位与操作符 ‘&’
平台:Visual studio 2017 && windows
*************************************************************************/
📝 实现代码Numberof2:
#include<stdio.h> int Numberof2(unsigned int n) { int count = 0; while(n) { if(n % 2 == 1) { count++; } n /= 2; } return count; } int main() { int n = -1; int ret = Numberof2(n); printf("%d\n", ret); return 0; }
📝 实现代码Numberof3:
#include<stdio.h> int Numberof3(int n) { int count = 0;//统计 //while循环的方法: /* int twice = 32;//循环次数 while(twice) { if(n & 1 == 1) { count++; } n >>= 1; twice--; } */ //for循环的方法: int i = 0; for(i = 0; i < 32; i++) { if(((n >> i) & 1) == 1) { count++; } } return count; } int main() { int n = -1; int ret = Numberof3(n); printf("%d\n", ret); return 0; }
❓❔ 看到这里,还可以优化或者有更好的写法吗,要的就是那种高大上的感觉
注:纯属为了装B😎
/***********************************************************************
目的:优化Numberof3代码
分析:n = n & (n - 1)
每次&都会去掉一个1(其实不难理解:只要有1,那么1 & 1-1则为0,直到全为0)
平台:Visual studio 2017 && windows
*************************************************************************/
📝 实现代码Numberof4:
#include<stdio.h> int Numberof4(int n) { int count = 0; while(n) { n = n & (n - 1); count++; } return count; } int main() { int n = -1; int ret = Numberof4(n); printf("%d\n", ret); return 0; }
🧿 拓展
/***********************************************************************
目的:写一个代码判断一个数字是不是2的n次方(n为正数)
分析:2的n次方数字,其补码只有一个1
▶ 我们当然可以去套用上面的Numberof4,但是这样就把代码复杂化了
▶ 只要n & (n - 1) == 0,n就是2的n次方
n = 8 | 状态 |
1000 | n |
0111 | n-1 |
0000 | n |
平台:Visual studio 2017 && windows
*************************************************************************/
📝 实现代码Numberof5:
#include<stdio.h> int Numberof5(int n) { if((n & (n - 1)) == 0) { return 1; } return 0; } int main() { int n = 8; //Numberof5这个函数如果返回1,表示这个数是2的n次方;否则不是 int ret = Numberof5(n); if(1 == ret) { printf("Yes\n"); } else { printf("No\n"); } return 0; }