我必须编写一个表达式,如果1
any bit in the least significant byte of k equals 1
我不能使用任何逻辑运算符。
掩盖我们使用的最低有效位
(x & 0xFF);
如果上述情况属实,如何在没有逻辑运算符的情况下返回0
或1
?
答案 0 :(得分:5)
这是一个解决方案,看起来甚至模糊不清逻辑运算符:
((unsigned char)k + 255) / 256
答案 1 :(得分:3)
这是一个强制将任何非零值强加到1
,同时保持零位的常用技巧:
return !!(x & 0xFF);
当且仅当x & 0xFF
为零时,此评估为零;否则,评估结果为1
。
还有一个更加丑陋的表达式,它完全避免了逻辑运算符:
return ((x>>0)|(x>>1)|(x>>2)|(x>>3)|(x>>4)|(x>>5)|(x>>6)|(x>>7)) & 1;
答案 2 :(得分:2)
没有逻辑运算符
// A little sneaky on the "No logical operators" part
int AnyLSBit8Set_switch(int x) {
unsigned char ch = (unsigned char) x;
switch (ch) {
case 0: return 0;
}
return 1;
}
答案 3 :(得分:2)
@ rici's很好。如果您不想使用(unsigned char)强制转换:
((((x%256)+256)%256)+255)/256
答案 4 :(得分:0)
如果k是一个整数类型,我相信这会起作用:k-((k>>8)<<8)
只是为了好玩,这是你可以使用的另一个:
bool lsb_non_zero(int k)
{
//for little endian, use this
return *(reinterpret_cast<unsigned char*>(&k));
//for big endian, use this
// return *(reinterpret_cast<unsigned char*>(&k +sizeof(int) -1));
}
或者,再次,只是为了它...... ....
#include<boost/detail/endian.hpp>
bool lsb_non_zero(int k)
{
#if defined BOOST_LITTLE_ENDIAN
return *(reinterpret_cast<unsigned char*>(&k));
#elif defined BOOST_BIG_ENDIAN
return *(reinterpret_cast<unsigned char*>(&k +sizeof(int) -1));
#endif
}