是否有一种算法可用于仅使用增量(C中为++
)从数字中减去1,并在C中留下逐位移位(<<
)?
编辑:我使用的是unsigned char
提前致谢
答案 0 :(得分:4)
您只需使用++
运算符即可。循环UCHAR_MAX
次迭代。虽然效率很低:
unsigned char c = 42;
unsigned char i = 0;
while (++i)
{
++c;
}
// c is now equal to 41
答案 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;
}