按位操作实现向右的逻辑移位

时间:2014-09-21 23:09:39

标签: c bit-manipulation bitwise-operators integer-arithmetic

所以我正在努力解决这个家庭作业,我已经坚持了几个小时的这个特定问题而无法解决这个问题。我觉得我太近了!但后来我在代码中改变了一些东西并且其他东西是对的......

/*
 * 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 - 但除此之外我不知道..

2 个答案:

答案 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中,>>是算术移位。 >>>是合乎逻辑的转变。