This question already has answers here:
Closed 10 months ago.
Implementing Logical Right Shift in C
(8个答案)
现在我正在读《计算机系统:程序员视角》一书。
书中的一个问题是对有符号整数执行逻辑右移,我不知道如何从这个开始。
以下是书中的实际问题:
填写以下C函数的代码。
函数
函数
您可以使用计算
我希望你现在明白这个问题。
最棘手的部分是生成掩码,但是如果您考虑应用左移,以便得到一个合适的值,或者随后再执行一个按位操作,您很快就会看到一个相当简单的解决方案。
(8个答案)
现在我正在读《计算机系统:程序员视角》一书。
书中的一个问题是对有符号整数执行逻辑右移,我不知道如何从这个开始。
以下是书中的实际问题:
填写以下C函数的代码。
函数
srl
使用算术右移位(由值xsra
给定)执行逻辑右移位,然后执行其他不包括右移位或除法的操作。函数
sra
使用逻辑右移位(由值xsrl
给定)执行算术右移位,然后执行其他不包括右移位或除法的操作。您可以使用计算
8*sizeof(int)
来确定w
,即数据类型int
中的位数。移位量可以从k
到0
不等。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;
.
.
.
}
我希望你现在明白这个问题。
最佳答案
我不会给你一个完整的答案,因为这显然是家庭作业,但我会给你一些提示,帮助你自己解决:
对于N位的逻辑右移,需要在算术移位后清除结果的前N位
可以通过应用适当的掩码清除值中的位,通常使用逐位“与”或“异或”
要清除一个值的前N位,需要一个带n0和剩余位1的掩码
您可以使用左移位W - N
位生成合适的掩码,其中W是一个字中的位数(您可以将其计算为W = sizeof(int) * CHAR_BIT;
)
例如,逻辑右移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
最棘手的部分是生成掩码,但是如果您考虑应用左移,以便得到一个合适的值,或者随后再执行一个按位操作,您很快就会看到一个相当简单的解决方案。
关于c - 在C中使用算术移位运算符执行逻辑移位,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17893901/
10-12 16:07