判断二进制数中的1有奇数个还是偶数个
来源:互联网 发布:腾讯软件下载官方网站 编辑:程序博客网 时间:2024/06/06 08:43
判断(32位)整数的二进制表示中的1有奇数个还是偶数个
最直接的思路就是求二进制数中1的个数,然后确定是偶数还是奇数。
代码如下:
第一次异或的结果,第i个位置上是1代表原数中第i位和第i+1位有一个为1,也就是奇数个1。也就是说,某个位为1,代表从它开始向左连续两位中1的个数是奇数(异或的本质)。
第二次异或,注意是两位两位的比较了,所有x是和x>>2做异或运算,比如,若结果第6位为1,那么代表上一次的结果的第6位和第8位有奇数个1,也就是原数中第6,7,8,9位中有奇数个1。
同样,到第五次运算结束后,过第0位为1代表0到31位共奇数个1。
整个过程就是不断的压缩信息,先用1位代表从本位开始向左的2位中1的奇偶,然后向左的4位,向左的8位。。。。
最直接的思路就是求二进制数中1的个数,然后确定是偶数还是奇数。
代码如下:
- // true为x二进制表示中含有奇数个1,false为偶数个1
- bool OddOnes(int x)
- {
- int cnt = 0;
- while(x)
- {
- cnt++;
- x &= x-1;
- }
- return cnt & 1;
- }
上述代码的就是先求x二进制中1的个数,方法就是通过x &= x-1去掉最右端的1,直到x变为0,去掉了几次1就是原x二进制中含有多少个1;然后确定个数为奇数还是偶数。
下面是利用强大的位运算来得到结果:
- bool OddOnes(int x)
- {
- x = x ^ (x >> 1);
- x = x ^ (x >> 2);
- x = x ^ (x >> 4);
- x = x ^ (x >> 8);
- x = x ^ (x >> 16);
- return x & 1;
- }
第二次异或,注意是两位两位的比较了,所有x是和x>>2做异或运算,比如,若结果第6位为1,那么代表上一次的结果的第6位和第8位有奇数个1,也就是原数中第6,7,8,9位中有奇数个1。
同样,到第五次运算结束后,过第0位为1代表0到31位共奇数个1。
整个过程就是不断的压缩信息,先用1位代表从本位开始向左的2位中1的奇偶,然后向左的4位,向左的8位。。。。
二进制运算是很强大的,平时应多注意思考和总结,恰当的使用二进制运算可以大大提高程序的效率。
0 0
- 判断二进制数中的1有奇数个还是偶数个
- 判断二进制数中的1有奇数个还是偶数个
- 判断1位十进制数是奇数还是偶数
- 判断一个数是偶数还是奇数
- 判断一个数是奇数还是偶数
- 判断一个数为偶数还是奇数
- 判断一个数是偶数还是奇数
- 判断一个整数的二进制数有多少个1
- 如何判断一个数的二进制有多少个1
- 判断一个数的二进制有多少个1
- 如何判断一个数的二进制有多少个1
- C语言判断一个数是偶数还是奇数
- 判断一个数是奇数还是偶数【按位与】
- c语言快速判断一个数是偶数还是奇数
- 在Java中判断一个数是奇数还是偶数
- 编写函数,若 x 有奇数个 1 则返回1, 偶数个返回 0
- 计算二进制数有多少个‘1’
- if 求最小值、判断键盘录入的数是奇数还是偶数、输出2个数中的最大值
- jQuery 1.9不支持$.browser 怎么判断浏览器类型和版本
- mysql Got a packet bigger than 'max_allowed_packet' bytes 错误原因及解决方法
- HDU 2955 Robberies 01背包
- SDUTOJ 2776 小P的故事——神奇的分组 背包
- uniq的简单使用
- 判断二进制数中的1有奇数个还是偶数个
- 调用系统时间dialog(TimePicker),并设置定时提醒功能
- 母函数入门~ HDU 2082/2079
- ASIHTTPRequest的使用——ASIFormDataRequest(自定义封装类)
- dll的概念、dll导出类
- web工程图片下载解决方案
- WIN 7 64位安装ORACLE 11g 64位问题
- 线程、事件与QObject
- MySQL错误代码