右移位C将unsigned int的开头加1

时间:2019-04-09 16:09:45

标签: c bit-shift

我试图移位16位地址以获得C中缓存模拟器的设置ID,但是当我尝试右移位时,我的数字上又多了一个1。

我的电话号码是0010100010011001。然后我向左移动3位数字以获得0100010011001000。到目前为止,一切都很好。但是,然后我尝试向右移动6位数字,最后得到0000010100010011而不是0000000100010011。我所有的整数都是无符号的,并且在尝试移位时只加一个1。

我要尝试转换的代码如下。在我的示例中,tag_size为3,b为6。

    unsigned int temp = addr << tag_size;
    unsigned int temp1 = temp >> b;
    unsigned int setid = temp1 >> tag_size;

2 个答案:

答案 0 :(得分:1)

16位int如今并不常见。您可以尝试将变量定义为short,通常为16位。这完全取决于您使用的机器。如果要查找16位整数,也可以使用uint16

问题似乎可能是因为您使用的unsigned int实际上不像克里斯汀·吉本斯在评论中提到的16位。当您将0010100010011001向左移动3个数字时,您会得到10100010011001000,而最左边的1不会像您期望的那样以16位整数形式被删除,那么当您再次向右移动时,您会得到1您没想到。

您可以将代码更改为此,并且它应该可以按照您最初的预期工作:

uint16_t temp = addr << tag_size;
uint16_t temp1 = temp >> b;
uint16_t setid = temp1 >> tag_size;

答案 1 :(得分:0)

您应该使用掩码并选择您感兴趣的位;例如:

unsigned int temp = (addr << tag_size) & 0xffffu; // keep 16 low bits
unsigned int temp1 = temp >> b;
unsigned int setid = temp1 >> tag_size;

如果我了解您的追求,则可以通过

完成同一件事
unsigned int temp = addr & (0xffffu >> tag_size); // keep 16 low bits
unsigned int setid = temp >> b;

unsigned int temp = (addr << tag_size) & 0xffffu; // keep 16 low bits
unsigned int setid = temp >> (b + tag_size);

这使代码独立于unsigned int的大小,C保证至少16位。