Saya telah melihat orang lain menggunakan Bitwise-OR untuk menggabungkan flag sebelumnya:
#define RUN 0x01
#define JUMP 0x02
#define SHOOT 0x04
const byte madPerson = RUN | JUMP | SHOOT;
Itu juga cara saya melakukannya.
Tapi saya juga melihat beberapa (tidak banyak) menggabungkan flag menggunakan tambahan:
#define RUN 0x01
#define JUMP 0x02
#define SHOOT 0x04
const byte madPerson = RUN + JUMP + SHOOT;
Mana yang lebih "dapat dibaca"? (Menurut Anda, mana yang akan dikenali lebih banyak orang?) Apa cara "standar" untuk melakukannya? Yang mana yang Anda sukai?
1<<0
,1<<1
,1<<2
, dan sebagainya. Ketika Anda memiliki banyak flag, itu menjadi lebih mudah dibaca, lebih dapat dipelihara, lebih sedikit rawan kesalahan. Misalnya, jika Anda mengemas semua 64 bit int 64 bit, Anda benar-benar ingin menghindari kesalahan ketik :) Cara Anda mewakili1
juga penting. Untuk integer 64 bit di VS2010 saya pikir itu1UI64
, atau sesuatu seperti itu. Menggunakan jenis yang salah bisa menggigit Anda.Jawaban:
Bitwise-ATAU.
Selain itu berbahaya.
Pertimbangkan sebuah contoh di mana seorang bandit adalah seseorang, dan seorang bandit yang marah adalah seorang bandit yang berbicara dan menembak. Kemudian, Anda memutuskan semua bandit harus menembak, tetapi Anda lupa tentang definisi bandit yang marah dan tidak menghapus bendera penembakannya.
Jika Anda menggunakan
angryBandit_add
gim Anda sekarang akan memiliki kesalahan logika yang membingungkan karena memiliki bandit marah yang tidak bisa menembak atau dibunuh.Jika Anda menggunakan
angryBandit_or
yang terburuk yang Anda miliki adalah berlebihan| SHOOTS
.Untuk alasan yang sama, bitwise TIDAK lebih aman daripada pengurangan untuk menghapus flag.
sumber
bitwise-ATAU menyampaikan maksud lebih jelas
juga, bitwise-OR harus lebih efisien
sumber