网站建设高清图片,网站建设幻灯片背景图片素材,金湖网站设计,多用户自助建站系统1 问题
实现一个函数#xff0c;输入一个函数#xff0c;输出该二进制数据中1的个数。例如9表示二进制数据1001#xff0c;有2位是1#xff0c;因此输入9#xff0c;该函数会输出2。 2 分析
我们先了解下计算机里面位运算#xff0c;有5种
1#xff09; 这个是与…1 问题
实现一个函数输入一个函数输出该二进制数据中1的个数。例如9表示二进制数据1001有2位是1因此输入9该函数会输出2。 2 分析
我们先了解下计算机里面位运算有5种
1 这个是与操作规律如下
1 1 1 1 0 0 0 1 0 0 0 0
2| 这个是或运算规律如下
1 | 1 1 1 | 0 1 0 | 1 1 0 | 0 0
3^ 异或运算规律如下
1 ^ 1 0 1 ^ 0 1 0 ^ 1 1 0 ^ 0 0
4 左移 mn 表示把m左移n位在左移n位的时候最左边的n位丢弃同时右边补上n个0 比如
00001010 2 0010100010001010 3 01010000
5 右移 左移 m n 表示把m右移n位在右移n位的时候最右边补上n个0 最左边分2种情况如果数字是一个无符号整形
则用0填补最左边的n位如果是一个有符号的数据则最左边用数字的符号填补n个数据。如果是正数左边补n个0是负数左边补n个1.
00001010 2 0000001010001010 3 11110001 这里我们可以把原数据和1进行操作如果二进制数据尾巴进行操作如果包含1的话1操作就是1返之结果为0然后我们把数据进行右移一位就行。 如果一个正数要除以2我们效率最高的是把这个数据进行右移一位。 3 代码实现
C版本
#include stdio.h/**二进制数据里面包含数字1的个数*/
int containOneNumber(int value)
{int count 0;while (value ! 0){//这里是(value 1)不是value 0if (value 1)count;//这里是value value 1,而不是value 1; 我们要用变量接收它//不然不管就只执行了一次也就是value除以了2所以导致死循环。value value 1;}return count;}int main(void)
{int result containOneNumber(9);printf(result is %d\n, result);return 0;
}
java版本
public int containOneNumber(int value){int count 0;while (value ! 0){if ((value 1) ! 0){count;}value value 1; //就是java中的无符号右移}return count;}
我们知道java用 是无符号右移右移的时候所以最高位左边都是0如果这个数是负数的时候右移的话最高位会补1
C版本就会变成死循环。 4 优化
方法1:
n与1做与运算判断n的最低位是不是为1,接着把1左移一位得到2再和n做与运算就能判断n的次低位是不是1….这样反复左移
int containOneNumber1(int n)
{int flag 1;int count 0;while (flag ! 0){if ((flag n) ! 0){count;}flag flag 1;}return count;
}方法2
把一个整数减去1再和原整数做与运算会把该整数最右边一个1变成0那么一个整数的二进制表示中有 多少个1就可以进行多少次这样的操作
int containOneNumber1(int n)
{int flag 1;int count 0;while (n ! 0){count;n n (n - 1);}return count;
} 5 总结
1 把一个整数减去1再和原整数做与运算会把该整数最右边一个1变成0那么一个整数的二进制表示中有多少个1
2n与1做与运算判断n的最低位是不是为1,接着把1左移一位得到2再和n做与运算就能判断n的次低位是不是1….这样反复左移
3 如果是正整数的情况下我们可以把正整数右移动和1进行操作然后再去统计。