ICS Return 1 when x contains an odd number of 1s,0 otherwise(判断二进制表示中1的个数是否为奇数)
2017-09-16 10:48
274 查看
本题棘手的地方在于不能用循环语句,并且最多只能包含12个算术运算、位运算和逻辑运算。
思路找了非常久,用了从一般到特殊,才慢慢发现规律。
首先来看只用两个bit的情况,未知数x共有四种(00,01,10,11),若要判断1的个数奇偶,不难发现只需用最高位异或最低位就可实现,即 x^(x>>1),如果结果为1,那么有奇数个,否则有偶数个。
从中不难看出对于32位的x,若 y1=x^(x>>1),那么y1的第i位为1表示x的第i位与第i+1位有奇数个1,y1的第i位为0表示x的第i位与第i+1位有偶数个1。由于奇数、偶数都是在Abel{0,1}中算,因此直接继续对y1操作,即只关心奇偶。
因此y2=y1^(y1>>2),即y2的第i位表示x的第i位到第i+3位的1的个数的奇偶。
不断重复此过程,直至y5,y5的第i位表示x的第i位到第i+32位的1的个数的奇偶。y5的第0位即是答案。
int odd_number(unsigned x)函数代码如下:
再补充一点,另一种做法也可以,而且思路比上面的做法更加直接,读者可以自己体会。 思路和上面是一样的。
代码如下:
int odd_number(unsigned x){
x=x^(x>>16);
x=x^(x>>8);
x=x^(x>>4);
x=x^(x>>2);
x=x^(x>>1);
return x&0x1;
}
思路找了非常久,用了从一般到特殊,才慢慢发现规律。
首先来看只用两个bit的情况,未知数x共有四种(00,01,10,11),若要判断1的个数奇偶,不难发现只需用最高位异或最低位就可实现,即 x^(x>>1),如果结果为1,那么有奇数个,否则有偶数个。
从中不难看出对于32位的x,若 y1=x^(x>>1),那么y1的第i位为1表示x的第i位与第i+1位有奇数个1,y1的第i位为0表示x的第i位与第i+1位有偶数个1。由于奇数、偶数都是在Abel{0,1}中算,因此直接继续对y1操作,即只关心奇偶。
因此y2=y1^(y1>>2),即y2的第i位表示x的第i位到第i+3位的1的个数的奇偶。
不断重复此过程,直至y5,y5的第i位表示x的第i位到第i+32位的1的个数的奇偶。y5的第0位即是答案。
int odd_number(unsigned x)函数代码如下:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int odd_number(unsigned x){ x=x^(x>>1); x=x^(x>>2); x=x^(x>>4); x=x^(x>>8); x=x^(x>>16); return x&0x1; } int main(){ int k; while(cin>>k){ cout<<odd_number(k)<<endl; } }
再补充一点,另一种做法也可以,而且思路比上面的做法更加直接,读者可以自己体会。 思路和上面是一样的。
代码如下:
int odd_number(unsigned x){
x=x^(x>>16);
x=x^(x>>8);
x=x^(x>>4);
x=x^(x>>2);
x=x^(x>>1);
return x&0x1;
}
相关文章推荐
- 当x有奇数个1时返回1,retrun 1 when x contains an odd number of 1s
- Write an Efficient Method to Check if a Number is Multiple of 3(快速判断3的倍数)
- [CareerCup] 5.2 Binary Representation of Real Number 实数的二进制表示
- 判断字符串中是否存在的几种方案:string.indexof、string.contains、list.contains、list.any几种方式效率对比
- poj 2699 The Maximum Number of Strong Kings 【二分 + 竞赛图建模判断是否满流】
- LeetCode Valid Number(判断字符串是否是合法的数字表示 )
- 程序员面试题目总结--数组(五)【数组的后面m个数移动为前面m个数、列的前n项数据、判断整数x是否可以表示成n个连续正整数的和、数组中出现奇数次的元素、二维数组中的查找】
- Return 1 when x can be represented as an n-bit, 2's complment number; 0 otherwise
- T.array.contains判断一个数组中是否包含给定元素
- (hdu step 5.1.1)A Bug's Life((ai,bi)表示ai、bi不在同一堆中,有若干对数据,判断是否有bug)
- 《高性能javascript》 --- in case of odd number of items(奇怪的条目的数量)
- Pass in an array of Deferreds to $.when()
- HDU 2444 The Accomodation of Students(判断是否为二分图+最大匹配)
- 一些不常用的T-sql(临时表,用变量表示表名,判断表,字段是否存在,sql启动job
- Number of Connected Components in an Undirected Graph
- 判断变量url值是否包含 “?”,如果url.indexOf("?")不等于-1说明包含 “?”
- Invalid update: invalid number of rows in section 0. The number of rows contained in an ....
- HDU 2108 Shape of HDU(判断给定的图形是否是凸多边形)
- es6中的Number.isNaN(),判断是否是NaN
- 判断两棵树是否相同(长子—兄弟表示法)