我正在尝试旋转带符号的字符(*c
),它的二进制位置是10011010
,右4(numRotate
)个位置。移位后的期望结果是10101001
。我目前拥有的代码是:
void right(char *c, int numRotate) {
*c = (*c >> numRotate) | (*c << (8 - numRotate));
}
根据我所学到的知识,这显然应该可以正确完成我所需的转变。相反,我得到的结果是11111001
。我不知道怎么了。 signed
和unsigned
char
数据类型可能有问题吗?我看过的所有资源仅使用无符号数据类型。
答案 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));
}