带符号字符(C)的位旋转?

时间:2018-10-20 05:26:02

标签: c types binary rotation bit-manipulation

我正在尝试旋转带符号的字符(*c),它的二进制位置是10011010,右4(numRotate)个位置。移位后的期望结果是10101001。我目前拥有的代码是:

void right(char *c, int numRotate) {
    *c = (*c >> numRotate) | (*c << (8 - numRotate));
}

根据我所学到的知识,这显然应该可以正确完成我所需的转变。相反,我得到的结果是11111001。我不知道怎么了。 signedunsigned char数据类型可能有问题吗?我看过的所有资源仅使用无符号数据类型。

2 个答案:

答案 0 :(得分:0)

在其他帖子Arithmetic bit-shift on a signed integer中已回答。要获得预期的结果,您应该使用未签名的字符。

$('form').submit(function() {
  $(this).hide();
})

带符号整数的右移运算符将用符号位(MSB)填充剩余空间,因此:

<script src="https://code.jquery.com/jquery-3.3.1.js"></script>

<tr>
  <td colspan="3">
    <h6>Have Discount Coupon? Apply it here...</h6>
  </td>
  <td>
    <div id="form">
      <form class="coupon" method="post">
        <input type="text" name="coupon" placeholder="Enter Coupon Code" autocomplete="off">
        <input type="submit" name="coupon" value="Apply Coupon">
      </form>
    </div>
  </td>
</tr>

我链接的问题的答案表明它是特定于编译器/平台的。因此,要使通常的最优化技术以负数工作以用移位操作将2的幂代替乘/除。示例:

void right(unsigned char *c, int numRotate) {
    *c = (*c >> numRotate) | (*c << (8 - numRotate));
}

输出:

10011010 >> 4 == 11111001
01011010 >> 4 == 00000101

答案 1 :(得分:0)

右移负值具有实现定义的行为。如果10011010为8位宽并且在您的平台上默认为带符号,则模式char的值为负。您必须使用unsigned char为您的目的定义行为:

void right(char *c, int numRotate) {
    *c = ((unsigned char)*c >> numRotate) | ((unsigned char)*c << (8 - numRotate));
}