判断一无符号整数的二进制形式中是否包含偶数个1
2012-06-28 16:27
239 查看
题目要求:若二进制无符号整数x包含偶数个1,返回1,否则返回0.
要求:只能使用位运算、加减法和==、!=,最多包含12个算术运算、位运算和逻辑运算,可以假设sizeof(unsigned)==4
不能使用乘除模运算,不能使用条件分支,循环,函数调用,大小比较等(详见《深入理解计算机系统》第二章习题)
代码如下:
[cpp] view
plaincopy
int even_ones(unsigned x )
{
unsigned x16 = (x>>16)^x;
unsigned x8 = (x16>>8)^x16;
unsigned x4 = (x8>>4)^x8;
unsigned x2 = (x4>>2)^x4;
unsigned x1 = (x2>>1)^x2;
return (~x1)&0x1;
}
思路:最直接的思路是分别把各位移动到最低位,然后与1,把各结果相加,得到1的个数。但明显这超出了题目限制。看来求和是行不通的。看到题目中只要求判断是否偶数个1.这里可能有窍门,应该会有一种方法虽然没有求出1的个数,但可以判断是否偶数个,异或是个神奇的运算,或许可以帮上忙。另外,32位实在太长,若用分治法逐个字节求出再总和似乎也不行。那使用字节两两运算呢?尝试中在纸上瞎写,突然想起,1和1异或为0,一下子消去了两个1.一个数减去2奇偶性不变,哦,最关键的思路出来了。把x对半,异或后得到的结果1的个数的奇偶性与x一致。重复此过程,把x折叠,最有得到只剩一位。因为偶数个要返回1,这时取反一下,取出最低位,即可!
转自:http://blog.csdn.net/zhzhanp/article/details/6324511#
要求:只能使用位运算、加减法和==、!=,最多包含12个算术运算、位运算和逻辑运算,可以假设sizeof(unsigned)==4
不能使用乘除模运算,不能使用条件分支,循环,函数调用,大小比较等(详见《深入理解计算机系统》第二章习题)
代码如下:
[cpp] view
plaincopy
int even_ones(unsigned x )
{
unsigned x16 = (x>>16)^x;
unsigned x8 = (x16>>8)^x16;
unsigned x4 = (x8>>4)^x8;
unsigned x2 = (x4>>2)^x4;
unsigned x1 = (x2>>1)^x2;
return (~x1)&0x1;
}
思路:最直接的思路是分别把各位移动到最低位,然后与1,把各结果相加,得到1的个数。但明显这超出了题目限制。看来求和是行不通的。看到题目中只要求判断是否偶数个1.这里可能有窍门,应该会有一种方法虽然没有求出1的个数,但可以判断是否偶数个,异或是个神奇的运算,或许可以帮上忙。另外,32位实在太长,若用分治法逐个字节求出再总和似乎也不行。那使用字节两两运算呢?尝试中在纸上瞎写,突然想起,1和1异或为0,一下子消去了两个1.一个数减去2奇偶性不变,哦,最关键的思路出来了。把x对半,异或后得到的结果1的个数的奇偶性与x一致。重复此过程,把x折叠,最有得到只剩一位。因为偶数个要返回1,这时取反一下,取出最低位,即可!
转自:http://blog.csdn.net/zhzhanp/article/details/6324511#
相关文章推荐
- 判断无符号整数的二进制形式中是否包含偶数个1
- 判断一无符号整数的二进制形式中是否包含偶数个1
- 对给定的字符串(只包含'z','o','j'三种字符),判断他是否能AC。 是否AC的规则如下: 1. zoj能AC; 2. 若字符串形式为xzojx,则也能AC,其中x可以是N个'o' 或者为空;
- 判断1个整数的二进制形式的1的个数
- 计算二进制整数中有多少个1 判断是否为2的n次幂
- 十进制数转二进制形式并判断它是否为2的n次幂(Java实现)
- 面试题:给40亿个不重复的无符号整数,没排过序,给一个无符号整数如何快速判断这个数是否在这40亿个数中
- 写一个函数,判断一个int型的正整数是否是2的幂,即是否可以表示成2^X的形式(不可以用循环)
- 写一个函数,判断一个int型的正整数是否是2的幂,即是否可以表示成2^X的形式(不可以用循环)
- 【非递归】判断一个整数是否能表示成2的指数形式(已附weapon0916兄的高效解法)
- 判断一个数的二进制形式是否只有一个1,是的话就输出
- 判断两个有符号整数的加法和乘法是否溢出
- 求整数的二进制形式中包含1的个数
- 判断两个64位无符号整数a和b相加是否溢出
- C# 判断字符串是否符合十六进制,八进制,二进制和十进制整数格式的正则表达式
- 判断字符串是否包含中文,过滤字符串中是否是整数或小数
- 数组A包含0到n的所有整数,但其中缺了一个,且数组A里的整数都是用二进制形式存储,求这个缺失的整数
- 1.求一个整数的二进制中1的个数 2.判断一个数是否是2的n次方
- 如何以最优时间复杂度得出——判断一个字节内的整数的二进制形式中的1个数
- 编写一个函数,从标准输入读取一列整数, 把这些值存储在一个动态分配的数组中并返回这个数组。 函数通过观察EOF判断输入列表是否结束。 数组的第一个数是数组包含的值的个数, 它的后面就是这些整数值。