我必须写一个表达式,1
如果any bit in the least significant byte of k equals 1
我不能使用任何逻辑运算符。
为了掩盖我们使用的最低有效位
(x & 0xFF);
如果上述情况属实,我如何返回0
或不使用逻辑运算符?1
我必须写一个表达式,1
如果any bit in the least significant byte of k equals 1
我不能使用任何逻辑运算符。
为了掩盖我们使用的最低有效位
(x & 0xFF);
如果上述情况属实,我如何返回0
或不使用逻辑运算符?1
这是一个解决方案,看起来甚至有点像逻辑运算符:
((unsigned char)k + 255) / 256
这是一个常见的技巧,可以强制任何非零值到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;
没有逻辑运算符
// 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;
}
@rici 的很好。如果您不想使用 (unsigned char) 强制转换:
((((x%256)+256)%256)+255)/256
如果 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
}