繁体   English   中英

我应该担心位顺序吗?

[英]Should I worry about bit order?

我已经达到了一个图书馆的设计点,我被字节序吓坏了。
我可以轻松处理字节顺序,但位顺序在我的代码中引入了巨大的复杂性。

我正在做的是将uint转换为字节,以网络字节顺序(大端)。
但是,我将最重要的 crumb(2 位,从第一个 [最重要的] 字节开始)用于其他用途,存储另一个数字。

通常,我使用这些行来写入和读取面包屑:

bytes[0] |= 0xC0 // Writing 11 to the most significant crumb. It could be 10 or 01 too. Before the disjunction, I know those two bits are 0.  
(bytes[0] & 0xC0) >> 6 // Getting the most significant crumb and shifting it to the right, in the least significant place.

对我来说,所有这些似乎都假设最重要的位在前。
如果没有,我的一对操作基本上会将 00000011 变成 00001100,这不是我需要的值。
该数据存储在文件中,可以在其他地方访问。 如果存储机和读取机使用不同的位序,读取器将得到垃圾。

我也不记得曾经读过一段对位顺序做出反应的代码。

所以,我的问题是:我只是偏执或我的 C# 库可以在 LSB 优先的机器上使用吗? (在 .NET 或 Mono 下;Windows、Unix、Android、iOS 等等)
如果是这样,我如何有效地处理可能性并能够正确检索我的 2 位数字?

由于您使用的是移位操作之类的东西:您很好。 Endianness 不会影响这些:它们在任何 *-endian 架构上的行为都是相同的 - 简单地说:它内部的工作方式可能会在 CPU 之间发生变化,但您总是会得到相同的答案,正如从常规代码中看到的那样。

字节序实际上只影响直接值到字节的解释,例如使用unsafe代码或BitConverter来获取(或设置) intdouble后面的原始字节,这是一个显式布局“联合”结构,与不同字段的字节重叠。 如果您不做那种类型的事情,那么您无需担心 CPU 字节序。

您不必担心位顺序。 然而,这些位是在 CPU 中处理的,相应的位操作对外部来说是一样的。

当你右移时,总是朝着最低有效位。 如果最低有效位实际上在CPU内部向左移动,则物理位向左移动,但CPU外部的数字表示仍然以最低有效位向右,运算符的含义是在任何 CPU 上都一样。

当您按位或使用0xC0进行位运算时,位在何处无关紧要,因为值中的最高有效位和0xC0的最高有效位在同一位置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM