所以我正在努力解决这个家庭作业,我已经坚持了几个小时的这个特定问题而无法解决这个问题。我觉得我太近了!但后来我在代码中改变了一些东西并且其他东西是对的......
/*
* logicalShift - shift x to the right by n, using a logical shift
* Can assume that 0 <= n <= 31
* Examples: logicalShift(0x87654321,4) = 0x08765432
* Legal ops: ! ~ & ^ | + << >>
* Max ops: 20
* Rating: 3
*/
int logicalShift(int x, int n) {
int move;
int y;
y = x >> n;
y = ~y << 1;
move = (y & (x >> n));
return move;
}
这里缺少什么?我将0x80000000 >> 31
设为0但应该为1 - 但除此之外我不知道..
答案 0 :(得分:0)
C >>
运算符已经对无符号整数执行逻辑右移。这样做你想要的吗?
#include <stdio.h>
unsigned long int logicalShift(unsigned long int x, unsigned int n) {
return x >> n;
}
int main() {
unsigned long int value = 0x80000000UL;
unsigned int shift_amt = 31;
unsigned long int result = logicalShift(value, shift_amt);
printf("0x%lx >> %d = 0x%lx\n", value, shift_amt, result);
return 0;
}
结果:
0x80000000 >> 31 = 0x1
如果不允许转换为无符号数据类型,则根据引用K&amp; R第二版的this answer by Ronnie,在C中右移有符号值的结果是实现定义的。即使this possible homework assignment被修改为允许除法运算符,另一种解决方案涉及对'x /(1&lt;&lt; n)&#39;也是有问题的,因为the rounding for division involving a negative number is also implementation-defined prior to C99。因此,除非您能告诉我们您的教师正在使用哪种C实现以及它实现了哪种ABI,否则这个问题似乎没有简单易用的答案。
答案 1 :(得分:0)
0x80000000&gt;&gt; 31 = 1,如果它是一个逻辑转变。
0x80000000&gt;&gt; 31 = -1,如果它是算术移位。
在C ++中,如果被移位的值是无符号的,那么它就是逻辑移位。
在Java中,>>
是算术移位。 >>>
是合乎逻辑的转变。