【问题标题】:Using bit manipulations, return word with all odd-numbered bits set to 1使用位操作,返回所有奇数位设置为 1 的字
【发布时间】:2023-02-01 13:13:00
【问题描述】:

这个问题是我的编码课程中一个更大的编码项目的一部分,介绍 C。该项目的目标是习惯位操作和浮点数。这样做,在限制条件下会出现一些问题。这是这个问题:

 /* 
 * OddBits - return word with all odd-numbered bits set to 1
 *   Legal operations: | <<
 *   Max operations: 6
 *   Rating: 2
 */

如你所见,对于他的问题,我只能用 |和<<。还有一些其他的假设也没有在这个问题中列出。他们是;没有大于 0xFF 的常量,假设是 32 位机器,并且没有诸如 do、if、while 或 else 之类的语句。还有我不能将变量转换为无符号。

这是我当前的代码:

int OddBits(void) {
  int x;
  return (x | (x << 1)) | ((x << 1) << 1);
}

评分软件抛出的错误信息是:

ERROR: Test OddBits() failed...
...Gives 0[0x0]. Should be -1431655766[0xaaaaaaaa]

如果有人能解释我的方法出了什么问题以及如何解决它,我将不胜感激。

【问题讨论】:

  • x 的初始值是多少?一个很好的起点...
  • 可能你想要return 0xaa | (0xaa &lt;&lt; 8) | (0xaa &lt;&lt; 16) | (0xaa &lt;&lt; 24); - 6 次操作
  • 我需要为变量赋值吗?“如果你不这样做,你就不知道未初始化的值可能是什么。该值可能正好是 0xaaaaaaaa 的可能性非常小,而且没有其他事情要做。(这是非常非常不可能的。 )
  • 是的,您需要先分配一个值才能使用该值(否则,将使用什么值?不是您可以控制的)。顺便说一句,你也可以在 4 个操作中解决这个问题。
  • 你不应该解决这个作业吗?使用 4 个操作的关键是将一个值与自身连接两次。一次将其从 8 位延长到 16 位,然后再从 16 位延长到 32 位。

标签: c bit-manipulation word


【解决方案1】:

我希望这个能帮上忙:

int OddBits(void) {
  return 0x55 | (0x55 << 8) | (0x55 << 16) | (0x55 << 24);
}

【讨论】:

    猜你喜欢
    • 2016-03-14
    • 1970-01-01
    • 2015-12-27
    • 2022-07-21
    • 1970-01-01
    • 2017-01-12
    • 2014-01-09
    • 2010-10-22
    • 2011-02-25
    相关资源
    最近更新 更多