如何从字节获取位值

本文关键字:获取 字节 | 更新日期: 2023-09-27 18:17:19

我有一个字节说 1 个字节的 8 元素。如何获取每个值的位?例如,我想要第 16 位值、第 17 位、第 18 位等。

    byte[] _byte = new byte[8];

如何从字节获取位值

您可以使用 BitArray(( 构造函数 BitArray((Byte[]( 从字节数组中获取位数组。对位数组使用索引器获取所需的位。

var bits = new BitArray(_byte);

现在位 16 将是位[15];

您可以按照此示例了解如何获取所需位。

byte[] _byte = new byte[3] {1,3,7};
var bits = new BitArray(_byte);
    for(int i=0; i < bits.Length; i++)
        Console.WriteLine(bits[i]);

输出:

时为真存在 1,位为假存在 0

第一个字节值 = 1 = 00000001(二进制(

True   = 1            0 bit index 
False  = 0            1 bit index   
False  = 0            2 bit index
False  = 0            3 bit index
False  = 0            4 bit index   
False  = 0            5 bit index
False  = 0            6 bit index
False  = 0            7 bit index  

第二个字节值 = 3 = 00000011(二进制(

True   = 1            8 bit index 
True   = 1            9 bit index   
False  = 0            10 bit index
False  = 0            11 bit index
False  = 0            12 bit index   
False  = 0            13 bit index
False  = 0            14 bit index
False  = 0            15 bit index  

第三个字节值 = 7 = 00000111(二进制(

True   = 1            16 bit index 
True   = 1            17 bit index   
True   = 1            18 bit index
False  = 0            19 bit index
False  = 0            20 bit index   
False  = 0            21 bit index
False  = 0            22 bit index
False  = 0            23 bit index  

如果你想使用位,你可以使用 BitArray 类。它的一个构造函数重载允许您传入字节数组。另外需要注意的是,该位将由一个布尔值表示,该布尔值具有真正的 '1' 和假的 '0'。

如果你想在你的字节数组中的第X位(我认为这至少是你的要求(,你需要从数组中索引正确的字节,然后提取该位

public static Boolean GetBitX(byte[] bytes, int x) {
    var index = x/8;
    var bit = x-index*8;
    return (bytes[index] & (1<<bit)) != 0;
}
public static Boolean GetBitX(byte[] bytes, int x) {
    var index = x/8;
    System.Collections.BitArray ba = new BitArray(new byte[]{bytes[index]});
    return ba.Get(x);
} 

您可以使用位数组

简单的方法。

使用示例:

答:10101010

乙:1

从 A 获取第 4 位,因此得到 B

getBit(A, 4(;

//gets n'th bit from a byte, returns as an int
int getBit(byte b, int bitNumber) {
   return ((b >> bitNumber) & 0x01);
}