2011-10-16 21 views
27

c tamsayı nth bayt olsun

int x = number & ((1<<8)-1); 

veya

int x = number & 0xFF; 

kullanarak ilk baytı bulabileceğinizi biliyorum. Ama tamsayıların nth baytını nasıl alacağımı bilmiyorum. Örneğin, 1234 00000000 00000000 00000100 11010010 olup 32bit tamsayıdır Tüm bu baytları nasıl alabilirim? ilki 210, ikincisi 4 ve son ikisi 0 olur.

+1

Örneğinizdeki bit shift operatörü '<<' kullanıyorsunuz. Numaranızdan farklı bitler elde etmek için vardiya operatörünü nasıl kullanabilirsiniz? –

+0

Diğer bit kaydırma operatörünü deneyin. –

+1

"İlk bayt" - burada kullandığınız gibi - bellekte ilk bayt olmayabilir. 1234 örneğiniz, en düşük adreste en çok 11010010 ve en yüksek adreste "00000000" olabilir. – Thanatos

cevap

60
int x = (number >> (8*n)) & 0xff; 

burada n, vb ilk byte ikinci bayt için 1,

+12

Lütfen parantez kullanın! Asla üye olamam. >> ya da '*' daha yüksek önceliğe sahip. –

2

int nth = (number >> (n * 8)) & 0xFF;

için 0

En düşük baytla taşıyın ve "tanıdık" şekilde alın. İçin

int x = ((unsigned char *)(&number))[n]; 

(n: (n + 1) (ayrıca küçük endian x86 gibi makinelerde önemli most- için en az önemlisi olan) onlar bellekte görünür olursa olsun amacıyla byte inci için

12

1) en azdan, büyük-endian makinelerinde en önemli için bayt inci: en azdan) en önemli (herhangi bir endian bayt için ise (n + 1 için

int x = ((unsigned char *)(&number))[sizeof(int) - 1 - n]; 

):

int x = ((unsigned int)number >> (n << 3)) & 0xff; 

Elbette, bunların hepsi, n < sizeof(int) ve number'un int olduğunu varsayar.

+0

Bir int dizimiz varsa, cevap nasıl değişecek? Ben bir int dizisinin başından nth byte değerini nasıl alabilirim? – HoseinGhanbari

+0

@HoseinGhanbari Aynı şekilde, ancak '(n/sizeof (int))' -th dizi öğesinin '(n% sizeof (int)) 'th byte değerini bulun. – Dmitri