2016-05-03 51 views
1

我有一個類的二進制面膜:解密二進制面膜C#

public class Masque 
{ 
    public bool MasquerAdresse { get; set; } 

    public bool MasquerCpVille { get; set; } 

    public bool MasquerTelephone { get; set; } 

    public bool MasquerFax { get; set; } 

    public bool MasquerEmail { get; set; } 
    public bool MasquerNom { get; set; } 
} 

和在數據庫中我有一個二進制面膜字段: 當我具有值1 => MasquerAdresse爲真,2 => MasquerCpVille是真實的,4 => MasquerTelephone是真的3 => MasquerAdresse和MasquerCpVille是真正的等等,這是該二進制面膜在C#解碼

+0

你的價值是什麼?由於有幾種方法可以像[BitArray](https://msdn.microsoft.com/en-us/library/system.collections.bitarray(v = vs.110).aspx)那樣執行此操作,因此您正在處理的內容 – jrbeverly

+0

你知道[Flags](https://msdn.microsoft.com/en-us/library/system.flagsattribute(v = vs.110).aspx)的枚舉和[Enum.HasFlag](https:// msdn.microsoft.com/en-us/library/system.enum.hasflag(v=vs.110).aspx)檢查設置位? –

+1

由於@Toxantron在下面的答案中寫道,標誌枚舉將更適合於此(因爲它們基本上是整型標誌)並且不需要具有多個布爾屬性。請記住,每個'bool'字段在.NET中佔用1個字節,因此如果您可以將這些標誌打包在單個「Int32」枚舉中(4個字節),它的傳遞效率也會更高。 **另一方面**,請注意,枚舉不能像類一樣擴展(繼承),這就是爲什麼人們有時會[使用你的方法](http://stackoverflow.com/q/757684/69809),或者其他方式允許未來的擴展。 – Groo

回答

4

正如其他人已經在C#中指出,我們通常使用Flag Enums最好梅索德和Enum.HasFlag()來做到這一點。正如@Groo在他的評論中所說的那樣,由於每個bool都佔用了一個完整的字節,所以這樣做更有效率。使用枚舉它應該是這樣的:

[Flags] 
public enum Masque 
{ 
    MasquerAdresse = 1, 

    MasquerCpVille = 2, 

    MasquerTelephone = 4, 

    MasquerFax = 8, 

    MasquerEmail = 16 

    MasquerNom = 32 
} 

var masque = Masque.MasquerAdresse | Masque.MasquerTelephone; 
var fromInt = (Masque) 5; 
var trueResult = masque.HasFlag(Masque.MasquerTelephone); 

但是,如果將此決定使用一個類就應該是這樣的:

public class Masque 
{ 
    public bool MasquerAdresse { get; set; } 
    public bool MasquerCpVille { get; set; } 
    public bool MasquerTelephone { get; set; } 
    public bool MasquerFax { get; set; } 
    public bool MasquerEmail { get; set; } 
    public bool MasquerNom { get; set; } 

    public static Masque FromBits(int bits) 
    { 
     return new Masque 
     { 
      MasquerAdresse = (bits & 1) > 0, 
      MasquerCpVille = (bits & 2) > 0, 
      ... 
     }; 
    } 
} 

使用二進制&它將應用所述位掩碼這兩種回報值或0.您可以將結果與掩碼(bits & 2) == 2進行比較,也可以只檢查> 0

+0

我將使用該類,我如何transoform位&1到布爾因爲&返回int – user1428798

+0

我的不好,應該先在Studio中進行測試。更新了答案。 – Toxantron