用逐位移位和递增实现减法

时间:2011-08-16 18:11:01

标签: c algorithm bit-shift

是否有一种算法可用于仅使用增量(C中为++)从数字中减去1,并在C中留下逐位移位(<<)?

编辑:我使用的是unsigned char

提前致谢

4 个答案:

答案 0 :(得分:4)

您只需使用++运算符即可。循环UCHAR_MAX次迭代。虽然效率很低:

unsigned char c = 42;
unsigned char i = 0;

while (++i)
{
    ++c;
}
// c is now equal to 41

LIVE DEMO

答案 1 :(得分:3)

是。您需要接近数字n,使n mod 255等于originalNumber - 1。最简单的方法是在你的号码上加255。这可以通过++运算符的255个应用程序来实现,或者通过移位直到需要添加来更智能地完成。

按要求编辑:

unsigned char c = 77;
unsigned char i = 0;


if(c < 128)
{
    i = c;
    c = c << 1;
}
while(++i)
{
    ++c;
}
// c == 76

我意识到这需要一个&lt; “操作员”,但说实话,如果计算机可以转移,它可以少于。否则,这种优化是不可能的。请记住,这也将最多移动1次,这对于3-127范围内的数字来说仍然更好。为了更多地转移,我们需要一个普通的旧+运算符用于我们的计数器i。虽然......我不知道任何无法添加的计算机。

答案 2 :(得分:0)

这也使用了+,所以它并不像Paul R的回答那么狡猾。

unsigned char subtract_one(unsigned char value)
{
    unsigned char addend= 0;

    unsigned char old_addend;

    do
    {
        old_addend= addend;
        addend= addend << 1;
        addend++;
    }
    while (old_addend!=addend); // stops when addend==-1;

    return value + addend;
}

答案 3 :(得分:0)

您也可以使用按位运算符实现加法,然后将其与其他2个解决方案复合以获得不需要“+”运算符的解决方案:

function add(int a, int b) {
   int x, y;
   do {
       x = a & b;
       y = a ^ b;
       a = x << 1;
       b = y;
   } while (a);
   return b;
}