我正在逐字节读取文件。
例如,我有这个字节:0x41(用十六进制表示为01000001)。
现在,我想要这个字节的前三位,即(010)。
我可以使用位逻辑来提取前三位,但我的问题是,这个字节的前三位是否独立于机器的字节序?(例如它们不能是001吗?)
谢谢。
例如,我有这个字节:0x41(用十六进制表示为01000001)。
现在,我想要这个字节的前三位,即(010)。
我可以使用位逻辑来提取前三位,但我的问题是,这个字节的前三位是否独立于机器的字节序?(例如它们不能是001吗?)
谢谢。
通常情况下,您无法从内存中读取字节的各个位,因此在内存架构方面实际上没有“位序”概念(我确定在硬件级别上有,但在软件级别不可见)。以下是您可能需要处理(或至少要知道)位序的几个领域:
编译器存储位字段的顺序是与编译器相关的(并不一定与硬件平台的字节序相关 - 不同的编译器可能会以不同的方式对相同平台的位字段进行排序 - 可能可以使用命令行选项将编译器配置为一种或另一种方式,类似于可以将char
设置为有符号或无符号)。但是,C位字段实际上与硬件寻址无关。
某些硬件架构确实允许您寻址单个位(例如ARM Cortex M3),因此在这种情况下,如果要使用该功能,则需要知道架构如何安排位的寻址。
如果您要通过串行链接发送位 - 硬件接口通常会指定最高有效位或最低有效位首先“移出”线路。
字节序只适用于字节顺序,而不是位顺序。相应字节内的位顺序将保持不变。
是的,它们将相同。
在字节内部的位序通常只有在进行逐位I/O时才会成为问题,例如在读取通过串行线发送的数据流时。这些数据流一次只发送一个位,因此发送方和接收方需要就每个字节发送的位是从左到右还是从右到左达成一致。
对于文件和内存访问,字节内部的位序不会改变。
x & (1 << 0)
或bittest(x, 0)
获取的任何位。 - Dwayne RobinsonC 语言中的位运算符是用于对 值 进行操作的。表达式 0x41U >> 5
将总是返回值 2(二进制中为 010)。