4

我的作业/项目中有一个问题,仅使用位移逻辑运算符将 1 添加到无符号整数。函数中不应有任何“+”、“-”、“*”或“/”符号。

我从最后几天开始尝试,但还没有成功。到目前为止,我已经尝试了以下方法:

int A = (((B&C)<<1)^(B^C))

谁能帮我解决这个问题。?

你可以用任何编程语言帮助我。

4

6 回答 6

17
unsigned int i = ...;
unsigned int mask = 1;
while (i & mask)
{
    i &= ~mask;
    mask <<= 1;
}
i |= mask;
于 2012-08-21T12:56:50.730 回答
8

爪哇:

public static int inc(int i){
        if ((i & 1) == 0)
            return i | 1;
        else 
            return inc(i>>1)<<1;
    }

PS while henrik的循环变体显然更快

于 2012-08-21T12:58:52.590 回答
3

试试这个:

int n = 3;
n = abs(~n);
std::cout << n;

~n = -(n+1)[~用于按位补码]。(n + 1)是由于在 2 的补码转换中加了 1。

(x + 1)再次获得应用否定。因此,最终表达式变为abs(~x)

于 2019-12-23T09:52:01.570 回答
0

在不使用算术运算符的情况下自增的逻辑(+, -. * and /

unsinged int no = 3; //actual number
unsigned int one = 1;
unsigned int ans = 0;
unsigned int carry = 0;
unsigned int prev_ans = 0;
unsigned int prev_carry = 0;

ans = no ^ one;
carry = no & one;

while (carry != 0)
{
   carry <<= 1;

   prev_ans = ans;
   prev_carry = carry;

   ans = prev_ans ^ prev_carry;
   carry = prev_ans & prev_carry;
}
于 2012-08-21T13:07:51.367 回答
0

Google for Full Adder并尝试实现一个。

于 2012-08-22T07:28:17.080 回答
-2

这太容易了,例如在 Haskell 中:

data Unsigned = Zero | Succ Unsigned
increment :: Unsigned -> Unsigned
increment u = Succ u

没有位或算术运算符,根本没有运算符!

于 2012-08-21T22:52:39.310 回答