Bitsel-VEYA Bayrak Ekleme


16

Başkalarının daha önce bayrakları birleştirmek için Bitwise-OR kullandığını gördüm:

#define RUN 0x01
#define JUMP 0x02
#define SHOOT 0x04

const byte madPerson = RUN | JUMP | SHOOT;

Ben de öyle yapıyorum.

Ancak bazı (çok değil) ek kullanarak bayrakları birleştirdim gördüm:

#define RUN 0x01
#define JUMP 0x02
#define SHOOT 0x04

const byte madPerson = RUN + JUMP + SHOOT;

Hangisi daha "okunabilir"? (Hangisinin daha çok insanın tanıyacağını düşünüyorsunuz?) Bunu yapmanın "standart" yolu nedir? Hangisini tercih ediyorsun?


Bu bir SO sorusu. Böyle bir şey kullanmayı düşünün 1<<0, 1<<1, 1<<2, vb. Çok sayıda bayrağa sahip olduğunuzda, daha okunabilir, daha sürdürülebilir, daha az hataya açık hale gelir. Örneğin, 64 bitlik bir intin 64 bitini paketliyorsanız, yazım hatalarından kaçınmak istersiniz :) Nasıl temsil ettiğiniz 1de önemlidir. VS2010'da 64 bitlik bir tam sayı için olduğunu düşünüyorum 1UI64, ya da böyle bir şey. Yanlış tip kullanmak sizi ısıtabilir.
Job

3
@ İş: Bir StackOverflow sorusu değil, çünkü okunabilirlik, tanınabilirlik, tercihler ve en iyi uygulamalar hakkında sorular soruyor. Bunun için tek bir objektif cevap yok; buraya ait.
Macneil

Yanıtlar:


34

Cinsindendir ya da.

Toplama tehlikelidir.

Bir haydutun bir kişi olduğu ve öfkeli bir haydutun konuşan ve ateş eden bir haydut olduğu bir örneği düşünün. Daha sonra, tüm haydutların ateş etmesi gerektiğine karar verdiniz, ancak kızgın haydut tanımını unuttun ve çekim bayrağını kaldırmayın.

#define PERSON 1 << 0
#define SPEAKS 1 << 1
#define SHOOTS 1 << 2
#define INVINCIBLE 1 << 3
const byte bandit = PERSON | SHOOTS;                    // 00000101
const byte angryBandit_add = bandit + SPEAKS + SHOOTS;  // 00001011 error
const byte angryBandit_or = bandit | SPEAKS | SHOOTS;   // 00000111 ok

Eğer angryBandit_addoyununuzu kullandıysanız , ateş edemeyen veya öldürülemeyen öfkeli haydutlara sahip olmanın şaşırtıcı mantığı hatası olurdu.

Eğer kullanılırsa angryBandit_orederdiniz kötü bir gereksiz | SHOOTS.

Benzer nedenlerden dolayı, bitsel NOT bayrakları kaldırmak için çıkarma işleminden daha güvenlidir.


11

bitwise-OR amacı daha açık bir şekilde iletir

ayrıca, bitsel-VEYA daha verimli olmalıdır


+1 gerçekten de OR'nin bu bayraklar olduğunu daha açık hale getirdiğini düşünüyorum, ancak verimlilikle ilgili olarak bitsel işlemlerin yavaş olduğu diller var, örneğin JavaScript tüm Sayılar bitli 64 operatörlerdir.
Ivo Wetzel

1
OP örneği göz önüne alındığında, bir OR veya ek satırın bir programın yürütme hızını olumsuz etkileyeceğini düşünmüyorum.
Tin Man

1
@Greg: özellikle bu örnekteki hesaplama derleme zamanında yapılacağından. :-)
Carson63000

Niyeti iletmenin yanı sıra, ADA, C #, Java dahil ancak bunlarla sınırlı olmamak üzere birçok dilde görmek oldukça yaygındır
Ken Henderson

2
"gerekir" bu işte çok büyük bir kelime. Bugün bu sorunla karşılaşmanız pek olası olmasa da, bit-VEYA talimatı olmayan bir işlemci üzerinde çalıştığım çok net anılarım var. Bir talimatta bitwise-AND olabilir ve bir talimatta bitwise-XOR yapabilirsiniz, ancak bitwise-VEYA iki tane aldı: biti kapatmak için hemen bitwise-AND ve yeni temizlenen biti tamamlamak için hemen bitwise-XOR. , tabii ki ayarladı.
John R. Strohm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.