如何仅使用位移和逻辑运算将unsigned int递增1?

Mic*_*yes 2 language-agnostic bit-shift

我的赋值/项目中有一个问题,即只使用位移逻辑运算符无符号整数加1 .函数中不应有任何"+"," - ","*"或"/"符号.

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

int A = (((B&C)<<1)^(B^C))
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我解决这个问题.

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

Hen*_*rik 14

unsigned int i = ...;
unsigned int mask = 1;
while (i & mask)
{
    i &= ~mask;
    mask <<= 1;
}
i |= mask;
Run Code Online (Sandbox Code Playgroud)

  • @MicroEyes所以你不喜欢while循环或什么?如果您有例如32位整数,您当然可以根据需要展开循环. (5认同)

gku*_*min 7

Java的:

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

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

  • 我在哪里违反这条规则?我无法检查条件? (2认同)
  • 根据提问者的评论,"如果没有按位运算符,我找不到计算方法.我不能在我的解决方案中使用按位运算".所以`^`也被禁止了.这可能(正如Henrik所说)让它变得不可能.或者,如果没有编写UINT_MAX代码行的顺序,也许只是不可能. (2认同)

Ism*_*ana 5

试试这个:

\n
int n = 3;\nn = abs(~n);\nstd::cout << n;\n
Run Code Online (Sandbox Code Playgroud)\n

~n = -(n+1)[~用于按位补码 ]。(n + 1)是由于 2\xe2\x80\x99s 补码转换中加 1 造成的。

\n

(x + 1)再次应用否定。所以,最终的表达式就变成了abs(~x)

\n