Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 获取字节-这是怎么回事?_C_Bit Manipulation - Fatal编程技术网

C 获取字节-这是怎么回事?

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

我想从32位整数中获取指定字节。我得到了错误的值,但我不知道为什么

对这个问题的限制是:

  • 必须使用有符号位,我不能使用乘法
  • 我特别需要知道下面的函数有什么问题
以下是函数:

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;
}