【发布时间】: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 << 8) | (0xaa << 16) | (0xaa << 24);- 6 次操作 -
“我需要为变量赋值吗?“如果你不这样做,你就不知道未初始化的值可能是什么。该值可能正好是 0xaaaaaaaa 的可能性非常小,而且没有其他事情要做。(这是非常非常不可能的。 )
-
是的,您需要先分配一个值才能使用该值(否则,将使用什么值?不是您可以控制的)。顺便说一句,你也可以在 4 个操作中解决这个问题。
-
你不应该解决这个作业吗?使用 4 个操作的关键是将一个值与自身连接两次。一次将其从 8 位延长到 16 位,然后再从 16 位延长到 32 位。
标签: c bit-manipulation word