【发布时间】:2017-01-23 07:31:05
【问题描述】:
我正在使用 C 语言中的逻辑右移函数,只使用位运算符。这是我所拥有的:
int logical_right_shift(int x, int n)
{
int size = sizeof(int); // size of int
// arithmetic shifts to create logical shift, return 1 for true
return (x >> n) & ~(((x >> (size << 3) - 1) << (size << 3) -1)) >> (n-1);
}
这实际上适用于所有情况,但 n = 0 除外。我一直在试图找出一种修复它的方法,以便它也适用于 n = 0,但我被卡住了。
【问题讨论】:
-
您正在为有符号类型创建逻辑右移运算符?
-
if (n == 0) { return x; }有什么问题? -
使用@Mark 的建议,你可以把它改成这样(不保证它有效):
return (n == 0 ? x : (x >> n) & ~(((x >> (size << 3) - 1) << (size << 3) -1)) >> (n-1)); -
@Dan:你想在答案中允许转换吗?
-
它应该在没有强制转换或条件语句的情况下完成。
标签: c bit-manipulation