开发者

c get nth byte of integer

开发者 https://www.devze.com 2023-04-13 04:35 出处:网络
I know you can get the first byte by using int x = number & ((1<<8)-1); or int x = number & 0xFF;

I know you can get the first byte by using

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

or

int x = number & 0xFF;

But I don't know how to get the nth byte of an integer. For example, 1234 is 00000000 00000000 00000100 11010010 as 32bit integer How can I get all of those bytes?开发者_Go百科 first one would be 210, second would be 4 and the last two would be 0.


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

where n is 0 for the first byte, 1 for the second byte, etc.


For the (n+1)th byte in whatever order they appear in memory (which is also least- to most- significant on little-endian machines like x86):

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

For the (n+1)th byte from least to most significant on big-endian machines:

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

For the (n+1)th byte from least to most significant (any endian):

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

Of course, these all assume that n < sizeof(int), and that number is an int.


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

Carry it into the lowest byte and take it in the "familiar" manner.


If you are wanting a byte, wouldn't the better solution be:

byte x = (byte)(number >> (8 * n));

This way, you are returning and dealing with a byte instead of an int, so we are using less memory, and we don't have to do the binary and operation & 0xff just to mask the result down to a byte. I also saw that the person asking the question used an int in their example, but that doesn't make it right.

I know this question was asked a long time ago, but I just ran into this problem, and I think that this is a better solution regardless.


//was trying to do inplace, would have been better if I had swapped higher and lower bytes somehow

uint32_t reverseBytes(uint32_t value) {
uint32_t temp;
size_t size=sizeof(uint32_t);

for(int i=0; i<size/2; i++){

//get byte i
temp = (value >> (8*i)) & 0xff;

//put higher in lower byte
value = ((value & (~(0xff << (8*i)))) | (value & ((0xff << (8*(size-i-1)))))>>(8*(size-2*i-1))) ;

//move lower byte which was stored in temp to higher byte
value=((value & (~(0xff << (8*(size-i-1)))))|(temp << (8*(size-i-1))));              
}
return value;
}
0

精彩评论

暂无评论...
验证码 换一张
取 消