将较低的字节(0-7)与较高的字节(8-15)交换一个

tac*_*ght 5 c c++

我现在知道它是如何在一条线上完成的,尽管我没有意识到为什么我的初稿也不起作用.我要做的是将下半部分保存到另一个变量中,将高位字节向右移动并通过OR添加两个数字.但是,它只是切割十六进制的下半部分并返回其余部分.

short int method(short int number) {


short int a = 0;
for (int x = 8; x < 16; x++){
    if ((number & (1 << x)) == 1){
        a = a | (1<<x);
    }
}

    number = number >> 8;

short int solution = number | a;
return solution;
Run Code Online (Sandbox Code Playgroud)

das*_*ght 8

你一次做一点; 一个更好的方法是通过一个操作来做到这一点:

uint16_t method(uint16_t number) {
    return (number << 8) | (number >> 8);
}
Run Code Online (Sandbox Code Playgroud)

上面的代码明确指定了16位无符号类型,从而避免了与符号扩展相关的问题.您需要包含<stdint.h>(或<cstdint>在C++中)才能进行编译.


Que*_*onC 4

if ((number & (1 << x)) == 1)

仅当 为 0 时才会返回 true。x由于二进制中的 1 为00000000 00000001,并且1 << x会将除第 x 位之外的所有位设置为 0。

你不关心它是否为 1,你只关心它是否非零。使用

if (number & (1 << x))

  • 如果该位被设置,该语句将“返回”什么? (2认同)