正在研究一些代码,并认为尝试实现一些快速的解决方法定义函数会有点聪明。然而当我决定将MostSigBit函数放在一个定义中并突然构建我的项目开始失败时,一切都变得沮丧。
甚至使用if-else语句重写了这段代码,没有运气仍然存在相同的结果!
#define MostSigBit(x) (x&0x80 == 0x80) (x = x<<1 ^ 0x1B) : (x <<= 1)
#define MultiplyBy2(x) (x != 0) ? (MostSigBit(x)) : 0
#define MultiplyBy3(x) (x != 0) ? (MostSigBit(x) ^ x) : 0
答案 0 :(得分:3)
缺少括号,应为:
#define MostSigBit(x) (((x) & 0x80 == 0x80) ? ((x) = ((x)<<1 ^ 0x1B)) : ((x) <<= 1))
#define MultiplyBy2(x) (((x) != 0) ? (MostSigBit(x)) : 0)
#define MultiplyBy3(x) (((x) != 0) ? (MostSigBit(x) ^ (x)) : 0)
考虑使用内联函数,因为Frederic写的宏是邪恶的:
inline char MostSigBit(char x) { return (x & 0x80 == 0x80) ? (x<<1 ^ 0x1B) : (x << 1); }
inline char MultiplyBy2(char x) { return x != 0 ? MostSigBit(x) : 0; }
inline char MultiplyBy3(char x) { return x != 0 ? MostSigBit(x) ^ x : 0; }
答案 1 :(得分:1)
缺少问号:
#define MostSigBit(x) (x&0x80 == 0x80) (x = x<<1 ^ 0x1B) : (x <<= 1)
应该是:
#define MostSigBit(x) (x&0x80 == 0x80) ? (x = x<<1 ^ 0x1B) : (x <<= 1)