以32位整数交换字节2和4

cza*_*r x 3 c bit-manipulation bitwise-operators

我有这个面试问题 -

交换整数序列中的字节2和字节4.整数是4字节宽,即32位

我的方法是使用char *pointer和a temp char来交换字节.为清楚起见,我已经打破了步骤,否则可以考虑字符数组.

unsigned char *b2, *b4, tmpc;
int n = 0xABCD; ///expected output 0xADCB
b2 = &n;   b2++;  
b4 = &n;   b4 +=3;
///swap the values;
tmpc = *b2;
*b2 = *b4;
*b4 = tmpc;
Run Code Online (Sandbox Code Playgroud)

还有其他方法吗?

Hot*_*cks 7

int someInt = 0x12345678;

int byte2 = someInt & 0x00FF0000;
int byte4 = someInt & 0x000000FF;
int newInt = (someInt & 0xFF00FF00) | (byte2 >> 16) | (byte4 << 16);
Run Code Online (Sandbox Code Playgroud)

为避免对签名扩展的任何担忧:

int someInt = 0x12345678;
int newInt = (someInt & 0xFF00FF00) | ((someInt >> 16) & 0x000000FF) | ((someInt << 16) & 0x00FF0000);
Run Code Online (Sandbox Code Playgroud)

(或者,为了给他们留下深刻的印象,你可以使用三重XOR技术.)

只是为了好玩(可能是某处的tupo):

int newInt = someInt ^ ((someInt >> 16) & 0x000000FF);
newInt = newInt ^ ((newInt << 16) & 0x00FF0000);
newInt = newInt ^ ((newInt >> 16) & 0x000000FF);
Run Code Online (Sandbox Code Playgroud)

(实际上,我只是测试了它,它的工作原理!)