以字节为单位的位顺序



你好,我试图了解如何获得或设置位,我被困在位顺序。假设我有一个数字70,它是01000110。我想把第一个位改为true,所以它变成了11000110,也就是198。我不明白或困惑的是我找到的方法。

public static void Set(ref byte aByte, int pos, bool value)
{
    if (value)
    {
        //left-shift 1, then bitwise OR
        aByte = (byte)(aByte | (1 << pos));
    }
    else
    {
        //left-shift 1, then take complement, then bitwise AND
        aByte = (byte)(aByte & ~(1 << pos));
    }
}
public static bool Get(byte aByte, int pos)
{
    //left-shift 1, then bitwise AND, then check for non-zero
    return ((aByte & (1 << pos)) != 0);
}

在这些方法中,当我想改变第一个位时,我必须传递位置7,我猜这是8位的最后一个索引。为什么呢?为什么字节的第一个位与最后一个索引改变?

为什么字节的第一个位与最后一个索引改变?

基本上,位通常指的是最低有效位是位0,然后是位1,等等。例如:

Bit:   76543210
Value: 01000110

因此值为70(十进制)的字节有1、2和6位。仅仅因为我们先写下一个最高有效位的字节并不意味着我们将其视为"第一个位"。(事实上,我可能会说它是"最高有效位"或"最高位",而不是使用"第一"。)

这个方案的好处是,无论值有多长,你都能得到相同的值——第0位总是值1,第1位总是值2,第7位总是值128,等等。

现在,这些都不会影响你的代码,它不关心我们调用的东西,但它关心值。幸运的是,命名约定在这里也帮助了我们。您只需要移动pos位留下的值1(即"仅仅是位0集")以获得位pos。例如,要得到第5位,我们只需向左移动5位就可以得到100000。

如果你认为1的值是一个完整的字节(00000001),它可能会变得更清楚:

00000001 << 0 = 00000001
00000001 << 1 = 00000010
00000001 << 2 = 00000100
00000001 << 3 = 00001000
00000001 << 4 = 00010000
00000001 << 5 = 00100000
00000001 << 6 = 01000000
00000001 << 7 = 10000000

最新更新