Seringkali saya melihat deklarasi enum bendera yang menggunakan nilai heksadesimal. Sebagai contoh:
[Flags]
public enum MyEnum
{
None = 0x0,
Flag1 = 0x1,
Flag2 = 0x2,
Flag3 = 0x4,
Flag4 = 0x8,
Flag5 = 0x10
}
Saat saya mendeklarasikan enum, saya biasanya mendeklarasikannya seperti ini:
[Flags]
public enum MyEnum
{
None = 0,
Flag1 = 1,
Flag2 = 2,
Flag3 = 4,
Flag4 = 8,
Flag5 = 16
}
Adakah alasan atau alasan mengapa beberapa orang memilih untuk menulis nilai dalam heksadesimal daripada desimal? Cara saya melihatnya, lebih mudah menjadi bingung saat menggunakan nilai hex dan tidak sengaja menulis Flag5 = 0x16
daripada Flag5 = 0x10
.
c#
.net
enums
enum-flags
Adi Lester
sumber
sumber
10
daripada0x10
jika Anda menggunakan angka desimal? Terutama karena ini adalah bilangan biner yang kita hadapi, dan hex dapat dikonversi secara mudah ke / dari biner?0x111
jauh lebih tidak menyebalkan untuk menerjemahkan di kepala seseorang daripada273
...Flag1 | Flag2
3, dan 3 tidak sesuai dengan nilai domain apa punMyEnum
.Jawaban:
Alasan mungkin berbeda, tetapi keuntungan yang saya lihat adalah bahwa heksadesimal mengingatkan Anda: "Oke, kita tidak lagi berurusan dengan angka di dunia basis sepuluh yang diciptakan manusia secara sembarangan. Kita berurusan dengan bit - dunia mesin - dan kita akan bermain sesuai aturannya. " Heksadesimal jarang digunakan kecuali jika Anda berurusan dengan topik tingkat yang relatif rendah di mana tata letak memori data penting. Menggunakannya mengisyaratkan fakta bahwa itulah situasi yang kita hadapi sekarang.
Juga, saya tidak yakin tentang C #, tetapi saya tahu bahwa di C
x << y
adalah konstanta waktu kompilasi yang valid. Menggunakan pergeseran bit tampaknya yang paling jelas:sumber
x << y
notasi.1 << 10 = KB
,1 << 20 = MB
,1 << 30 = GB
Dan sebagainya. Sangat menyenangkan jika Anda ingin membuat array 16 KB untuk buffer Anda bisa pergivar buffer = new byte[16 << 10];
Ini membuatnya mudah untuk melihat bahwa ini adalah bendera biner .
Meskipun perkembangannya membuatnya lebih jelas:
sumber
012
sebenarnya10
.int
. Aku tahu itu bodoh ... tapi kebiasaan sulit hilang.Saya pikir itu hanya karena urutannya selalu 1,2,4,8 dan kemudian tambahkan 0.
Seperti yang Anda lihat:
dan seterusnya, selama Anda mengingat urutan 1-2-4-8, Anda dapat membuat semua flag berikutnya tanpa harus mengingat pangkat 2
sumber
Karena
[Flags]
artinya enumnya benar-benar bitfield . Dengan[Flags]
Anda dapat menggunakan operator bitwise AND (&
) dan OR (|
) untuk menggabungkan flag. Ketika berhadapan dengan nilai biner seperti ini, hampir selalu lebih jelas untuk menggunakan nilai heksadesimal. Inilah alasan utama kami menggunakan heksadesimal di tempat pertama. Setiap bersesuaian karakter hex ke persis satu menggigit (empat bit). Dengan desimal, pemetaan 1-ke-4 ini tidak berlaku.sumber
Karena ada cara mekanis dan sederhana untuk menggandakan kekuatan dua dalam hex. Dalam desimal, ini sulit. Ini membutuhkan perkalian yang panjang di kepala Anda. Dalam hex itu adalah perubahan sederhana. Anda dapat melakukan ini sampai
1UL << 63
yang tidak dapat Anda lakukan dalam desimal.sumber
Karena lebih mudah untuk mengikuti manusia dimana bit-bit tersebut berada di dalam bendera. Setiap digit heksadesimal dapat memuat biner 4 bit.
Biasanya Anda ingin flag Anda tidak tumpang tindih dengan bit, cara termudah untuk melakukan dan memvisualisasikannya adalah menggunakan nilai heksadesimal untuk mendeklarasikan flag Anda.
Jadi, jika Anda membutuhkan flag dengan 16 bit, Anda akan menggunakan 4 digit nilai heksadesimal dan dengan demikian Anda dapat menghindari nilai yang salah:
sumber