使用C中的算术移位运算符执行逻辑移位

时间:2013-07-27 03:18:41

标签: c bit-manipulation bit-shift bits

现在我正在阅读计算机系统:程序员视角。

这本书

书中的一个问题是对有符号整数执行逻辑右移,我无法弄清楚如何从此开始。

以下是本书中的实际问题:

  

填写以下C函数的代码。

     
      
  • 函数srl使用算术右移(由值xsra给出)执行逻辑右移,然后执行不包括右移或除法的其他操作。

  •   
  • 函数sra使用逻辑右移(由值xsrl给出)执行算术右移,然后执行不包括右移或除法的其他操作。

  •   
     

您可以使用计算8*sizeof(int)来确定w,即数据类型int中的位数。转移金额k的范围可以从0w − 1

unsigned srl(unsigned x, int k) {
    /* Perform shift arithmetically */
    unsigned xsra = (int) x >> k;
    .
    .
    .
}

int sra(int x, int k) {
    /* Perform shift logically */
    int xsrl = (unsigned) x >> k; 
    .
    .
    .
}

我希望你现在明白这个问题。

1 个答案:

答案 0 :(得分:2)

我不会给你一个完整的答案,因为这显然是家庭作业,但我会给你一些提示,帮助你自己解决这个问题:

  • 对于N位的逻辑右移,您需要在算术移位后清除结果的前N位

  • 您可以通过应用适当的掩码来清除值中的位,通常使用按位AND或XOR

  • 要清除值的前N位,需要一个N 0和剩余位1的掩码

  • 您可以使用左移W - N位生成合适的掩码,其中W是单词中的位数(可以计算为W = sizeof(int) * CHAR_BIT; })

E.g。对于逻辑右移2

value              = 10001010
value >>= 2        = 11100010     // arithmetic right shift

mask               = 00111111     // mask has top 2 bits set to 0

value & mask       = 00100010     // apply mask to get logical right shift

最棘手的部分是生成掩码,但是如果你考虑应用 left 移位这样一个合适的值,可能后面再进行一次按位操作,你很快就会看到一个相当简单的解决方案。