Nibble_Swap 或交换 0x1234

问题描述 投票:0回答:2

输入为 0x1234,我希望输出为 0x2143,但我得到 0x4321

#include <stdio.h>

#define SWAP(num) (((num) & 0x0F) << 4) | (((num) & 0xF0) >> 4)

int main() {
    short input = 0x1234;
    short output = SWAP(input);
    
    print("Input: 0x%04X\n", input);
    print("Output: 0x%04X\n", output);
    
    return 0;
}
c bitwise-operators bit-shift bitwise-and bitwise-or
2个回答
0
投票

您得到的不是 0x4321,而是 0x0043。您忘记了高字节,并且写了

print
而不是
printf
。下面的代码可以满足您的要求。

#include <stdio.h>

#define SWAP(num) (((num) & 0x0F00) << 4) | (((num) & 0xF000) >> 4) | \
    (((num) & 0x0F) << 4) | (((num) & 0xF0) >> 4)

int main() {
    short input = 0x1234;
    short output = SWAP(input);
    
    printf("Input: 0x%04X\n", input);
    printf("Output: 0x%04X\n", output);
    
    return 0;
}

0
投票

这个宏

#define SWAP(num) (((num) & 0x0F) << 4) | (((num) & 0xF0) >> 4)

仅交换较低有效字节的两个半字节。

所以结果会是

0x43

如果你想得到输出

0x2143

你需要写

#include <stdio.h>

#define SWAP(num) ( ( ( num ) & 0xF000u ) >> 4 | ( ( num ) & 0x0F00u ) << 4 |\
( ( num ) & 0xF0u ) >> 4 | ( ( num ) & 0x0Fu ) << 4 )

int main( void )
{
    short input = 0x1234;
    short output = SWAP( input );

    printf( "%#x\n", output );
}
© www.soinside.com 2019 - 2024. All rights reserved.