C 数循环移位错误答案

标签 c bit-manipulation shift

右移的实现是:

unsigned int rotr(unsigned int value, int shift) {
    return (value >> shift) | (value << (sizeof(value) * 8 - shift));
}

但如果值为 0x17=00010111,则结果应为 0x8b=10001011,但结果为 0x8000000b

如何处理这个问题?

#include <stdio.h>
unsigned int rotr(unsigned int value,int shift) {
    return (value >> shift) | (value << (sizeof(value) * 8 - shift));
}
int main()
{
  unsigned int a = 0x17;
  printf("%x",rotr(a,(unsigned)1));
}

=> 8000000b

最佳答案

这是在 32 位整数中旋转 0x17 的正确结果:您从

00000000 00000000 00000000 00010111

你最终得到了

10000000 00000000 00000000 00001011

如果您想旋转一个 8 位数字,请使用 uint8_t 而不是 int 作为函数参数:

uint8_t rotr(uint8_t value, int shift) {
    // No need to multiply by sizeof(value), because the type uint8_t forces it to be 1
    return (value >> shift) | (value << 8 - shift));
}

关于C 数循环移位错误答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20744066/

相关文章:

将一个字节转换为 8 个 boolean 值

c++ - 在不移动末尾的情况下删除文件中间的字节?

c - 在 C 中扫描文件

assembly - 68k/x86 上的左移溢出?

c - 按位移位*负数以反转数字中的位

c++ - 生成汉明距离 t 内的所有比特序列

c - 如何重新启动链表的循环?

C - 另一个 strtok() 和 free() 问题

c - 小写到大写

Java 整数右移 32