2011-10-16 37 views
27

Tôi biết bạn có thể nhận được các byte đầu tiên bằng cách sử dụngc có được byte thứ n của số nguyên

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

hoặc

int x = number & 0xFF; 

Nhưng tôi không biết làm thế nào để có được byte thứ n của một số nguyên. Ví dụ: 1234 là 00000000 00000000 00000100 11010010 dưới dạng số nguyên 32 bit Làm cách nào để nhận tất cả các byte đó? đầu tiên người ta sẽ được 210, thứ hai sẽ là 4 và cuối cùng hai sẽ là 0.

+1

Bạn đã sử dụng toán tử thay đổi bit << << 'trong ví dụ của mình. Làm thế nào bạn có thể sử dụng toán tử shift để nhận các bit khác nhau trong số của bạn? –

+0

Hãy thử toán tử thay đổi bit khác. –

+1

Hãy nhớ rằng "byte đầu tiên" - như bạn đã sử dụng nó ở đây - có thể không phải là byte đầu tiên trong bộ nhớ. Ví dụ của bạn, 1234, có thể rất dễ dàng là '11010010' ở địa chỉ thấp nhất và '00000000' ở địa chỉ cao nhất. – Thanatos

Trả lời

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

trong đó n là 0 cho byte đầu tiên, 1 byte thứ hai vv

+12

Vui lòng sử dụng dấu ngoặc đơn! Tôi không bao giờ có thể thành viên cho dù '>>' hay '*' có ưu tiên cao hơn hay không. –

2

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

Mang nó vào byte thấp nhất và mang nó theo cách "quen thuộc".

12

Đối với (n + 1) byte trong bất cứ thứ tự mà chúng xuất hiện trong bộ nhớ (mà cũng được least- để most- quan trọng trên máy ít về cuối nhỏ như x86) thứ:

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

Đối với (n +1) lần thứ byte từ ít đến quan trọng nhất trên máy lớn-endian:

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

Đối với (n + 1) byte thứ từ ít đến quan trọng nhất (bất kỳ endian):

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

Tất nhiên, tất cả đều giả định rằng n < sizeof(int) và rằng numberint.

+0

Nếu chúng ta có một mảng int, Câu trả lời sẽ thay đổi như thế nào? Tôi có nghĩa là làm thế nào tôi có thể nhận được giá trị byte thứ n từ đầu của một mảng int? – HoseinGhanbari

+0

@HoseinGhanbari Tương tự như vậy, nhưng tìm '(n% sizeof (int))'-byte của phần tử '-n (size) (int))'-mảng. – Dmitri

Các vấn đề liên quan