现在我正在阅读计算机系统:程序员视角。
这本书书中的一个问题是对有符号整数执行逻辑右移,我无法弄清楚如何从此开始。
以下是本书中的实际问题:
填写以下C函数的代码。
函数
srl
使用算术右移(由值xsra
给出)执行逻辑右移,然后执行不包括右移或除法的其他操作。函数
sra
使用逻辑右移(由值xsrl
给出)执行算术右移,然后执行不包括右移或除法的其他操作。您可以使用计算
8*sizeof(int)
来确定w
,即数据类型int
中的位数。转移金额k
的范围可以从0
到w − 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; . . . }
我希望你现在明白这个问题。
答案 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 移位这样一个合适的值,可能后面再进行一次按位操作,你很快就会看到一个相当简单的解决方案。