2016-11-11 90 views
-2

我有一个字节说8个元素的1个字节..我如何得到每个值的位?例如,我想第16位的值,第17位,所以在18位..如何从字节获取位值?

byte[] _byte = new byte[8]; 
+0

您不能得到第17位,_byte只有8位... – Radagast

+1

它有64位...它是8字节的字节.. 8 * 8 = 64知道吗? –

+0

@ArnaldoBadin错误 – MickyD

回答

3

您可以使用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 

第二个字节 Value = 3 = 00000011(Binary)

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 
1

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

1

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

public static Boolean GetBitX(byte[] bytes, int x) { 
    var index = x/8; 
    var bit = x-index*8; 

    return (bytes[index] & (1<<bit)) != 0; 
} 
1
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); 
} 

您可以使用BitArray