3

我必须写一个表达式,1如果any bit in the least significant byte of k equals 1

我不能使用任何逻辑运算符。

为了掩盖我们使用的最低有效位

(x & 0xFF);

如果上述情况属实,我如何返回0或不使用逻辑运算符?1

4

5 回答 5

5

这是一个解决方案,看起来甚至有点像逻辑运算符:

((unsigned char)k + 255) / 256
于 2013-10-01T01:38:42.650 回答
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;
于 2013-10-01T01:21:42.290 回答
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;
}
于 2013-10-01T01:43:19.687 回答
2

@rici 的很好。如果您不想使用 (unsigned char) 强制转换:

((((x%256)+256)%256)+255)/256
于 2013-10-01T01:52:14.583 回答
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
}
于 2013-10-01T02:05:32.703 回答