我想从 32 位整数中获取指定的字节。我得到了错误的值,但我不知道为什么。
该问题的限制是:
- 必须使用有符号位,并且我不能使用乘法。
- 我特别需要知道下面的函数出了什么问题。
这是函数:
int retrieveByteFromWord(int word, int byte)
{
return (word >> (byte << 3)) & 0xFF;
}
例如: (3) (2) (1) (0) ------ 字节数 在word中:10010011 11001100 00110011 10101000
我想返回字节 2 (1100 1100)。
retrieveByteFromWord(word, 2)
---- 给出:1100 1100
但对于某些情况,它是错误的,并且它不会告诉我是什么情况。
有什么想法吗?
<小时/>问题是这样的:
您刚刚开始为一家公司工作,该公司正在实现一组程序来操作数据结构,其中 4 个有符号字节被打包到 32 位无符号字节中。字内的字节从 0(LSB) 到 3(MSB) 编号。您被分配的任务是使用 2 的补码算术和算术右移实现机器的函数,原型(prototype)如下:
typedef unsigned packed_t
int xbyte(packed_t word, int bytenum);
这是之前员工的一次尝试,但他因错误而被解雇:
int xbyte(packed_t word, int bytenum)
{
return (word >> (bytenum << 3)) & 0xFF;
}
A) 代码有什么问题?
B) 仅使用左移、右移和一次减法编写正确的实现。
我已经做了B,但仍然不知道为什么A是错误的。是因为十进制数字像 12、15、19、55 一样,然后被打包成一个单词,然后当我提取它们时,它们不再是同一个数字了???可能是这样,我要快速运行一些测试......
最佳答案
由于这是家庭作业,我不会给你完整的答案,但我会为你指出正确的方向。您的问题陈述指出:
4 signed bytes are packed into a 32 bit unsigned.
当您按位&
一个最高有效位为0xFF的32位有符号整数时 - 即符号位 - 结果总是0
,因此无论输入如何,原始函数都不会返回负值。
举例来说...
当您说“retrieveByteFromWord(word, 2) ---- 给出:11001100”时,您错了。
您的返回类型是 32 位整数 - 而不是 8 位整数。您没有返回 11001100
,而是返回 00000000 00000000 00000000 11001100
。
关于c - 获取字节 - 这是怎么错的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7284136/