如何乘以三十六分之一

时间:2014-03-04 16:03:29

标签: c bit-manipulation

我需要使用! ~ & ^ | + << >>之类的按位运算将数字乘以3/16,舍入为零。到目前为止,我有以下几点,唯一的问题是当数字为负时它不起作用,它总是向下舍入而不是为零。我知道如果声明如果x是负数然后加15,那应该是按位的。但我不知道如何实现它,任何帮助都表示赞赏。

int ezThreeSixteenths(int x) {
    int times_two = x << 1;
    int times_three = times_two + x;
    int divide_eight = times_three >> 4;
    int a = 0b11111111;
    int a1 = a << 8;
    int a2 = a << 16;
    int a3 = 0b11111 << 24;
    int mask = a | a1 | a2 | a3;
    int final = divide_eight & mask;
    return final;
}

2 个答案:

答案 0 :(得分:0)

如果你有一个你感到满意的功能,当它是正数时,测试MSB检测一个负位,如果是这样的话,取两个补码(你不说是否可以使用-以及+但您可以使用^+),运行您的函数,然后再次使用二进制补码。

答案 1 :(得分:0)

使用二进制补码将负数转换为正数。那么当你完成后将正数转换回负数?