簡體   English   中英

使用C#設置字節數組中的位

[英]Setting bits in a byte array using C#

我有一個32字節的字節數組,其中每個字節的前4位(0到3)代表1到128之間數字的置位或未設置狀態。例如,如果給定數字3,則需要設置數組第一個字節的第2位。 如果給我數字9,則需要設置數組第三個字節的位0。 我遇到的問題是在C#中找到一種明智的方式來做到這一點。 我敢肯定,必須有一種簡單的數學方法,但是到目前為止,還沒有找到一種方法。 當我抓着這個頭時,我以為我會看看是否有人可以提供一些建議。

---------更新-------------------

根據給出的答案,我產生了以下功能。 這正是我需要的。 我可能沒有清楚說明我需要什么,但已為我提供了足夠的建議以找到正確的代碼。

// outputNumber = number passed into this function

byte[] bytes = new byte[32];

int bit = (outputNumber - 1) % 4;

byte byteSetting = (byte)(1 << bit);

bytes[(outputNumber - 1) / 4] |= byteSetting;
int byt = bitNumber / 4; // You could do byt = bitNumber >> 2
int bit = bitNumber % 4; // You could do bit = bitNumber & 3

bytes[byt] |= (byte)(1 << bit);

bytes是您的字節數組。

重置它:

bytes[byt] &= (byte)(byte.MaxValue ^ (1 << bit));

讀取字節的值:

var res = bytes[byt] & (byte)(1 << bit)

(如果您有興趣, ^是異或運算符)

您可以像這樣在數組中的每個字節中設置位:

array[2] |= (byte)(1<<3); // set bit #4 / index 3 in array element #3 / index 2

您可以清除如下所示的內容:

array[2] &= unchecked((byte)(~(1<<3))); // clear the same bit we set previously

需要類似的東西。 在64位系統上,請使用ulong(32位-> uint)而不是字節。 性能差異非常明顯。

public struct BitField {

    private ulong[] _Values;

    private BitField(ulong[] values) {
        _Values = values;
    }

    public static BitField New() {
        return new BitField(new ulong[] { 0ul, 0ul });
    }

    public BitField Clone() {
        return new BitField(new ulong[] { _Values[0], _Values[1] });
    }

    public void Clear() {
        _Values[0] = ulong.MinValue;
        _Values[1] = ulong.MinValue;
    }

    public void SetAll() {
        _Values[0] = ulong.MaxValue;
        _Values[1] = ulong.MaxValue;
    }

    public void AND_Combine(BitField bitField) {

        _Values[0] &= bitField._Values[0];
        _Values[1] &= bitField._Values[1];
    }

    public void OR_Combine(BitField bitField) {

        _Values[0] |= bitField._Values[0];
        _Values[1] |= bitField._Values[1];
    }

    public bool Intersects(BitField bitField) {

        if ((_Values[0] & bitField._Values[0]) > 0) {
            return true;
        }
        else {
            if ((_Values[1] & bitField._Values[1]) > 0) {
                return true;
            }
            else {
                return false;                                   
            }
        }
    }

    public bool this[int index] {
        get {
            if (index > 127 || index < 0) {
                return false;
            }
            int item = index >> 6;
            int bit = index % 64;

            ulong compare = 1ul << bit;
            return ((_Values[item] & compare) == compare);
        }
        set {
            if (index >= 0 || index < 128) {
                int item = index >> 6;
                int bit = index % 64;
                ulong compare = 1ul << bit;

                if (value) {
                    _Values[item] |= compare;
                }
                else {
                    _Values[item] &= ~compare;
                }
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM