【问题标题】:Replicating the function of a for loop using only bitwise operators仅使用按位运算符复制 for 循环的功能
【发布时间】:2016-07-18 09:58:01
【问题描述】:

我正在尝试仅使用按位和某些运算符复制循环的功能,包括 ! ~ & ^ | + << >>

int loop(int x) {
   for (int i = 1; i < 32; i += 2)
     if ((x & (1 << i)) == 0)
       return 0;
   return 1; 
}

我不确定如何仅使用这些运算符来复制循环的累积性质。我理解转移&lt;&lt;&gt;&gt; 将允许我乘法和除法。然而,使用!~&amp;^~ 进行操作已被证明更加困难。有什么建议吗?

http://www.tutorialspoint.com/cprogramming/c_operators.htm

编辑: 我了解如何实现位的添加,但不了解如何在不先调用 while 或 for 循环的情况下实现这样的输出。

【问题讨论】:

  • 首先考虑函数实际在做什么 - 它正在测试所有奇数位以查看它们是否全为 1。那么您将如何使用位运算符在单个操作中做到这一点? (想想面具。)
  • 这个问题是怎么重复的?
  • @Silverfin:你的逻辑有点不对劲——你可能想使用所有奇数位的掩码 (0xaaaaaaaa),因为这些是你感兴趣的位。那么函数就是return (n &amp; mask) == mask;(你不需要if)。如果您不能使用==,那么请考虑如何通过进一步的按位运算来实现它。
  • 是的,这看起来很有希望,假设您被允许使用逻辑非运算符 (!)。
  • @PaulR 我可以,我对事情有了更好的把握。谢谢你。

标签: c++ c for-loop bit-manipulation bitwise-operators


【解决方案1】:

也许这会有所帮助:

int loop(int x) {
    x = x & 0xaaaaaaaa; // Set all even numbered bits in x to zero
    x = x ^ 0xaaaaaaaa; // If all odd numbered bits in x are 1, x becomes zero
    x = !x;             // The operation returns 1 if x is zero - otherwise 0
    return x;
}

【讨论】:

  • 也许我不明白,但这确实返回一个大于 1 的值,不是吗?
  • 哦,我明白了,因为!不合逻辑。聪明!
【解决方案2】:

您的代码测试所有奇数位,如果所有奇数位都已设置,则返回 1。您可以使用此位掩码:...0101 0101 0101 其中,对于 32 位是 0xAAAAAAA。 然后你把你的价值和按位计算出来。如果结果与您的掩码相同,则表示所有位都已设置。

int testOddBits(int x) {
    return (x & 0xAAAAAAAA) == 0xAAAAAAAA;
}

【讨论】:

  • @PaulR 不,它不是,因为返回的是 int,而不是 bool。
  • 哦,我明白了,我没听懂你。我虽然你会建议返回 x & 0xAAAAAAA。你是对的,对不起。
  • @Silverfin 您的函数不会多次返回。您只能返回一次。该函数将被中止,并返回单个值。
  • 有趣的是看到 [C] 中的 each_and_every 答案是如何被否决的,即使它是对问题的正确答案,并且可能(也可能不会)有一个小失误。有趣的是,所有这些“专家”都闭上嘴而不是回答,然后挑剔那些这样做的人。
  • @RaulR 据我了解,问题出在循环上,?: 在 OP 提供的链接中进行了解释。所以我看不出为什么马里奥的回答“没有帮助”,它暗示使用掩码与它进行与运算,而不是使用循环。让 OP 决定返回类型是否重要
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多