2016-02-02 20 views
5

Bazı bitly operatörler üzerinde çalışıyorum ve bir sayının son 16 ikili basamağını ayıklamak ve onlarla bir işlem yapmak istiyorum. Ben temelde 0xFFFFFFFF gibi bir negatif int görmek ve daha sonra LSB FFFF ayıklamak ve 0 ile bitiştirmek, böylece 0x0000FFFF yerine öyle bir sıfır ile sonuçlandırmak istiyorum. Sadece küçük negatif sayıları önemsiyorum, bu yüzden LSB ihtiyacım olan tüm bilgiler olmalı.Bir negatif sayının son 16 ikili basamağını nasıl alabilir ve birleştirebilirsiniz?

İşte C benim yaklaşımdır:

#include <stdio.h> 

int main(){ 
    int a = -1, c = 0; 
    short b = (short)a; 
    printf("a is %x\nb is %x",a,b); 
    c = (0 << 16) | b; 
    printf("\nc is %x\n", c); 
    return 0; 
} 

Benim düşünce süreci yerine FFFFFFFF ait FFFF benziyor ben daha iyi bir zaman olacak bu yüzden benim int a kısa dönüştürmek olabilir olmanın. Ne yazık ki benim için, bu

+2

'in dökme (kısa) a' herhangi geniş çünkü gereksizdir değeri otomatik olarak –

+0

@ LưuVĩnhPhúc teşekkürler. Bu bit manipülasyon söz konusu olduğunda kısa kullanmak için herhangi bir sebep var mı? –

+2

Bazı durumlarda gerekli, ancak bu durumda değil –

cevap

5

değişkenleri için ffffffff'u yazdırıyor Ne işe yaramadı, çünkü bitwise-OR operatörü (|), her iki işlenende ayarlanmış herhangi bir biti ayarlar.

İstenmeyen bitleri gizlemek için bitsel-AND operatörünü (&) kullanmak istiyorsunuz. Bu, her iki işlenende açıkça görülen herhangi bir biti temizler.

c = (0 << 16) | b; 

Buna: Bu

Değişim

c = b & 0xFFFF; 

Ve çıkış olacaktır:

a is ffffffff 
b is ffffffff 
c is ffff 
+0

16 MSB için ben c = b & 0xFFFF0000' diyecek? –

+1

@ user3470987 Neredeyse. Bu size 0xFFFF0000 değerini verecektir. Eğer '0x0000FFFF' istiyorsanız, c = (imzasız int) (b & 0xFFFF0000) >> 16' yapmak zorundasınız. Cast, 1 bitlerin sola kaydırılma olasılığını önlemek için gereklidir. – dbush

İlgili konular