C 获取字节-这是怎么回事?
我想从32位整数中获取指定字节。我得到了错误的值,但我不知道为什么 对这个问题的限制是:C 获取字节-这是怎么回事?,c,bit-manipulation,C,Bit Manipulation,我想从32位整数中获取指定字节。我得到了错误的值,但我不知道为什么 对这个问题的限制是: 必须使用有符号位,我不能使用乘法 我特别需要知道下面的函数有什么问题 以下是函数: int retrieveByteFromWord(int word, int byte) { return (word >> (byte << 3)) & 0xFF; } 这是他之前的一次尝试,他因为犯错而被解雇: int xbyte(packed_t word, int byte
- 必须使用有符号位,我不能使用乘法李>
- 我特别需要知道下面的函数有什么问题
int retrieveByteFromWord(int word, int byte)
{
return (word >> (byte << 3)) & 0xFF;
}
这是他之前的一次尝试,他因为犯错而被解雇:
int xbyte(packed_t word, int bytenum)
{
return (word >> (bytenum << 3)) & 0xFF;
}
int xbyte(压缩字,int字节)
{
return(word>>(bytenum要处理数字,请使用有符号整数类型,例如int
)
要使用位,请使用无符号整数类型,例如无符号
。也就是说,让字
参数的类型为无符号
。这就是无符号类型的用途
要乘以8,只需写*8
(这并不意味着代码的这一部分在技术上是错误的,只是它是人为设计的,不必要的不可读)
更好的是,为这个神奇的数字8创建一个自描述的名称,例如*bitsPerByte
(标准库称它为CHAR\u-BIT
,它不是特别自描述的,也不可读)
最后,在设计级别,考虑设计函数,以便使用函数的代码(每次调用)变得清晰易读。例如,像int const b=byteAt(2,x);
。这可以通过防止错误的实际参数顺序来防止错误,而且由于为可读性设计使代码更易于阅读,因此可以减少在这方面花费的时间。:-)
Cheers&hth.,适用于正数。您可能希望将word
强制转换为无符号,以使其适用于具有MSB集的整数
int retrieveByteFromWord(int word, int byte)
{
return ((unsigned)word >> (byte << 3)) & 0xFF;
}
int retrieveByteFromWord(int字,int字节)
{
return((未签名)word>>(byte因为这是作业,我不会给你完整的答案,但我会给你指出正确的方向。你的问题陈述说:
4有符号字节被压缩为32位无符号字节
当按位&
使用0xFF的32位有符号整数时,结果的最高有效位(即符号位)始终为0
,因此无论输入如何,原始函数都不会返回负值
举个例子
当你说“retrieveByteFromWord(word,2)——gives:11001100”时,你错了
您的返回类型是32位整数,而不是8位整数。您没有返回11001100
您正在返回00000000000000000000000000111001100
,如果您不解释它应该做什么,我们怎么知道它是错的呢?包括一些输入和预期输出的示例。在我的VS2008上,此代码按预期工作。它在字节
给定的位置上提取给定单词
中的一个字节(0是LSB,3是MSB)。-1没有说明“错误值”是什么是的。我希望,因为我和0xFF,在某种情况下,我将删除一个位或在应该重置时保持一个位设置,但我找不到一个特定的位。如果我知道错误的值是什么,我将能够修复它,不是吗???我投票支持将其命名为bitsperotet
,因此,试图消除幻数的徒劳性变得更为严重pparent.:-@R:标准库使用字符位的原因是它并不总是8。在某些系统上它是16(例如,德克萨斯仪器DSP)。自从我写了上面的答案以来,这个问题已经改变了很多。@anonymous downvoter:请说明你的否决理由,以便其他人可以从你的见解中受益。
int retrieveByteFromWord(int word, int byte)
{
return ((unsigned)word >> (byte << 3)) & 0xFF;
}