C x的最低有效字节中的任何位等于1

时间:2013-10-01 01:20:44

标签: c

我必须编写一个表达式,如果1

,将返回any bit in the least significant byte of k equals 1

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

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

(x & 0xFF);

如果上述情况属实,如何在没有逻辑运算符的情况下返回01

5 个答案:

答案 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
}