12

我必须实现一个将字节写入ostream对象的方法。我们就叫这个ostream对象吧strobj。我还有一个用于存储一个字节数据的位缓冲区,我们称之为:

char &bitter;

在我的头文件中,我有这个:

void writeThisByte(int sumInt);

说明说我必须将传入的 int 的“不太重要的字节”写入ostream对象,即strobj

但是,我对最低有效字节的确切含义感到困惑。

这是否意味着您正在检查是否sumInt == 1?如果是,你会这样写ostream吗?

strobj.write(&bitter, 1);

我不知道 :(

4

4 回答 4

20

想象一个 32 位整数,其中每个位可以是 0 或 1,例如:

011101010101010101010101010110110
                         ^^^^^^^^

最低有效字节是右侧的 8 位。

如果你举一个十进制的例子,可能更容易理解:给定数字 291023,'3' 是最不重要的数字,因为如果你改变它,你对总数的影响最小。

要获得最低有效字节,只需按位-int与 0xFF 十六进制或 255 十进制 (1+2+4+8+16+32+64+128=255) 的较大值-这将清除所有更重要的位和保留 8 个最低有效位...

int x = ...whatever...;
unsigned char least_significant_bits = x & 255;

效果是这样的:

011101010101010101010101010110110 // x
000000000000000000000000011111111  //255
result:
000000000000000000000000010110110 // x & 255
于 2013-05-14T04:55:05.900 回答
11

int由几个字节组成(很可能是 2、4 或 8 个字节)。与最低有效位的概念类似,最低有效字节是整个整数值中权重较小的字节。根据系统的字节顺序,它可能是内存的第一个或最后一个字节。

要提取最低有效字节,按位与一个字节为1s 的数字,即 255:

int LSB = (someInteger & 0xFF);
于 2013-05-14T04:53:35.597 回答
4

an 的更重要的位是int对其价值贡献更大的位。最低有效位的贡献较小。您通常可以通过将整数与255(a byte with all 1s)

int lsb;
lsb = SumInt & 255;
于 2013-05-14T04:53:17.307 回答
4
  • 当您查看十进制数时,例如 507,最低有效位将是 7。将其更改为 6 或 8 将比更改 5 更改总数要小得多。

  • 当您查看日期时,例如May 14, 2013,就时间顺序而言,最不重要的部分是日期 (14)。

  • 当您查看无符号的 32 位 int(4 个字节)时,其中整数的值是(256^3)*b3 + (256^2)*b2 + 256*b1 + b04 个字节b0, b1, b2, b3最低有效字节是 byte b0

您可以按照其他人的建议从您int sumInt那里获得最低有效字节。char c = sumInt & 0xFF;

于 2013-05-14T05:32:28.663 回答