【问题标题】:How to Increment unsigned int by 1 using bit-shifting & logical opr only?如何仅使用位移和逻辑 opr 将 unsigned int 增加 1?
【发布时间】:2012-08-21 12:51:41
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 三种语言,你告诉我们这不是家庭作业?!
  • 如果我们可以在 任何 语言中提供帮助,请使用 [language-agnostic] 标签,而不是您能想到的随机流行标签。
  • 您有权重新标记问题。 :]
  • @KerrekSB,这作业。我在学校的时候有一个完全相同的硬件......否则,我可以做到。 :D
  • 如果只允许!&amp;&amp;||&lt;&lt;&gt;&gt;,那就不可能了。

标签: language-agnostic bit-shift


【解决方案1】:
unsigned int i = ...;
unsigned int mask = 1;
while (i & mask)
{
    i &= ~mask;
    mask <<= 1;
}
i |= mask;

【讨论】:

  • 我在问题中提到只使用 bit-shifting逻辑运算符
  • @MicroEyes 所以你不喜欢 while 循环还是什么?如果你有例如32位整数,你当然可以根据需要展开循环。
【解决方案2】:

Java:

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

附: henrik 的 while 循环变体显然更快

【讨论】:

  • 先生,我提到了只使用 bit-shifting逻辑运算符
  • 我在哪里打破这个规则?我无法检查条件?
  • 你使用|,根据提问者的定义,它既不是位移运算符也不是逻辑运算符。
  • 根据提问者的评论,“我找不到没有按位运算符的计算方法。我不能在我的解决方案中使用按位 opr”。所以^也是被禁止的。这可能(正如 Henrik 所说)使其成为不可能。或者,如果不编写大约 UINT_MAX 行的代码,也许根本不可能。
【解决方案3】:

试试这个:

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

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

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

【讨论】:

  • 我投了赞成票,因为它很有趣,但它违反了使用否定运算符的问题规则。
  • 哦,我错过了,顺便说一句,你可以用abs() 替换这个否定运算符,如下所示:int n = 3; n = abs(~n); std::cout &lt;&lt; n; 我会更新我的答案,谢谢。
【解决方案4】:

在不使用算术运算符的情况下重新计算数字的逻辑(+, -. * 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;
}

【讨论】:

    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-19
        • 2014-11-25
        • 1970-01-01
        • 2014-12-04
        • 2021-12-13
        • 2011-02-09
        • 2019-08-07
        • 1970-01-01
        相关资源
        最近更新 更多