c - 获取字节 - 这是怎么错的?

标签 c bit-manipulation

我想从 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/

相关文章:

c - 检测宏是否无效

javascript - 如何从 Javascript 代码在 C# 中进行十进制按位运算

c++ - 使用 int 数组的一部分时的字节顺序

c - C 中的移位操作

android - OpenCV android中MAT的大小仍然是1920*2560*CV_8UC4

c - 如何借助 for 循环在 C 中创建螺旋和棋盘

c - 将 char 转换为 int 时出现意外行为

c - 预期 ';' 标识符或 '(' 之前的 'void' token ?

c - 采用函数指针并返回 block 的 block 的 block 签名

c++ - 如何找到第一个非重复元素?