2010-08-06 12 views
16

:Basit yön/unset bireysel bit Şu anda bir bayt içinde/unset bireysel bit ayarlamak için bu kullanıyorum

if (bit4Set) 
    nbyte |= (1 << 4); 
else 
    nbyte &= ~(1 << 4); 

Ama yapamaz daha basit/zarif olduğunu yolu? Tek bir işlemde biti ayarlamak veya ayarlamak gibi mi?

Not: Anladığım kadarıyla bir işlev yazabilirim, sadece tekerleği yeniden icat etmeyecek miyim diye merak ediyorum.

+4

http://stackoverflow.com/questions/47981/how-do-you-set-clear-and-toggle-a-single-bit-in-c – obelix

+4

@obelix: Öyleyse bu her şeyden önce en ufak sorular zaten cevaplandı mı? + 112/+ 241, 90 Favs? Büyük Soru/Harika Cevap Altın Rozeti? –

cevap

12

Elbette! kodunuzda |= ve &= genişletilmiş eğer daha belirgin olur ama yazabilirsiniz: bit4Set Bunun sıfır veya sıfır olmayan herhangi Value- -not bir çalışmak olması gerektiğini

nbyte = (nbyte & ~(1<<4)) | (bit4Set<<4); 

Not.

+0

unset, sonra bit4set'e bağlı olarak ayarlayın. Bunu düşünmemiştim. Tks. – djeidot

+7

nbyte = (nbyte & ~ (1 << 4)) | ((!! bit4Set) << 4) 'bit4Set'in sıfıra ya da sıfır olmamasına özen gösterir. –

11

Bir işlev içine koyun, boole türü tüm bitval girişler için 0,1'i zorlar.

int change_bit(int val, int num, bool bitval) 
{ 
    return (val & ~(1<<num)) | (bitval << num); 
} 
+0

Eğer bir işleve koyarsam yazdığım kodu kullanmayı tercih ederim. Yine de doğru. – djeidot

+5

Derleyicinin C++ uygulamasında bu işlevi etkinleştirmesine izin verirseniz, ifadenin kendisini kullanmış olmanız kadar hızlı olacaktır, ayrıca okunabilirlik bonusu elde edersiniz. –

0
nbyte |= (1 << 4); 

atama, (1 << 4) sağ tarafında, böyle bir sabit zaman ise, ortaya çıkan montaj basit olacaktır öyleyse bu muhtemelen derleyici tarafından optimize olacaktır:

mov r0, _nbyte 
mov r1, 10H   ; here is the optimization, no bit shift occured 
or r0, r1 
st _nbyte, r0 
+3

Bu, "nbyte'da bit 4'ü nasıl ayarlayabilirim?" Sorusunun yanıtıdır. Soru, "bit4Set'in değerine bağlı olarak nbyte'da bit 4'ü nasıl ayarlayabilirim?" –

+0

Teşekkürler. Soruyu yanlış anladım. Cevabımı silmeli miyim? – Donotalo

6

Bu, tamamen makul ve tamamen standart bir deyimdir.

+1

+1 Bu deyim zamanını tekrar mikroişlemci kodunda görüyorum. –

+0

Bu _probably_, performansı etkileyebilecek dallanma sunar.Pascal Cuoq'un cevabı daha az okunabilir, ancak daha fazla performans gösterebilir. –

4

Numaralarına bunlara atıfta bulunmak yerine, bitlerinize anımsatıcılar ve/veya tanımlayıcılar atamayı düşündünüz mü? Örnek olarak, bit 4'ün bir nükleer reaktör SCRAM'ı başlattığını söyleyebiliriz. Buna "bit 4" olarak atıfta bulunmak yerine, INITIATE_SCRAM olarak adlandıracağız.

int const INITIATE_SCRAM = 0x10; // 1 << 4 

... 

if (initiateScram) { 
    nbyte |= INITIATE_SCRAM; 
} else { 
    nbyte &= ~INITIATE_SCRAM; 
} 

Bu mutlaka orijinal kod daha başka etkin (optimizasyon sonra) olmayacak, ama biraz sanırım, net ve muhtemelen daha sürdürülebilir var: İşte bunun için kod görünebilir nasıl.

+0

, hemen hemen aynı şey. Ben aslında tanımlayıcıları kullanıyorum, onları örneklemedim. – djeidot

2

Bu C++ olarak etiketlenmiştir, bu yüzden tüm bit manipülasyonunu kendiniz yapmak yerine std::bitset kullanmayı düşündünüz mü? Sonra uygun biti ayarlamak için dizi gösterimini bits[3] = bit4Set olarak kullanabilirsiniz.