我的函数接受32位int,如果该数字在任何偶数位置都有1,我需要返回0或1。我不能使用任何条件语句,我也一次只能访问8位。
以下是输入示例: 10001000 01011101 00000000 11001110
1)用AA(10101010)移动位和它们,并将每个位存储在一个变量中。
int a = 10001000
int b = 1000
int c = 0
int d = 10001010
现在我需要返回一个0,如果没有设置奇数位,如果有,则需要返回1。我们可以看到有。所以我需要将这些组合成一个数字,然后使用!!操作员返回0或1.这是我遇到麻烦的地方。
int valueToReturn = a | b | c | d;
现在我需要说:
return !!valueTOReturn;
没有人能给我任何洞察力的正确值?
我不能使用任何条件语句,如|| &安培;&安培;
我明白了。我说的所有内容都给出了正确的答案,但我抓住了我的一个变量的错误值。谢谢你的帮助!
答案 0 :(得分:0)
但是,我不知道我是否理解正确,如果有32位数字,如果为0,则只能关闭所有位。
if(input_number == 0 )
return 0;
else
return 1;
答案 1 :(得分:0)
如果你不能使用条件,你将不得不以丑陋的方式做到这一点:取每个偶数索引位的位并返回它们的OR。你可以跳过面具。虽然这有点愚蠢,而且做得很糟糕。
编辑我的答案,删除错误的第一部分。
看来arnaud576875的逻辑是正确的!运营商:http://www.gnu.org/s/gnu-c-manual/gnu-c-manual.html#The-Logical-Negation-Operator
直到有人能找到C99规范参考(GNU实现可能与它不同),我想我肯定不会知道,但我怀疑你的C版本和我之前描述的一样。
答案 2 :(得分:0)
首先,你不是按照你的想法存储位。
int a = 10001000
实际上是10,001,000(二进制,b100110001001101001101000)。
你说该函数采用32位整数,所以你可以做的是提取每个8位部分,如下所示:
unsigned char a, b, c, d;
a = (unsigned char)(input & 0xff);
b = (unsigned char)((input >> 8) & 0xff);
c = (unsigned char)((input >> 16) & 0xff);
d = (unsigned char)((input >> 24) & 0xff);
现在您可以执行屏蔽/测试操作:
return (0xAA & a) | (0xAA & b) | (0xAA & c) | (0xAA & d);
答案 3 :(得分:0)
正如bdares所说,它只是很多按位操作...... evenbit_int
计算所请求的值。
#define evenbit_byte(x) (((x) >> 1 | (x) >> 3 | (x) >> 5 | (x) >> 7) & 1)
#define evenbit_int(x) (evenbit_byte(x) | evenbit_byte(x >> 8) | evenbit_byte(x >> 16) | evenbit_byte(x >> 24))
或略微更优化
byte evenbits(DWORD x)
{
byte a = x >> 8;
byte b = x >> 16;
byte c = x >> 24;
return (evenbit_byte(x) | evenbit_byte(a) | evenbit_byte(b) | evenbit_byte(c))
}