麻烦理解位移位如下

Trouble understanding bit shifting as follows

所以我写了下面的代码,它接受一个 unsigned int ,将它的位向左移动 6 个位置,然后用另一个 int 值替换空的最后 6 位。但是,当我 运行 代码说值为 15 时,第一步起作用并且我得到值 960(因此向左移动 6 有效)。但是 or 步骤似乎不起作用,当我实际需要获取 1111111111111111 或即 65535 时,我得到 -1(注意本例中的操作数值是 -1)?任何帮助将不胜感激。我知道这可能与我的类型有关,但 s->data 被定义为无符号整数,而操作数被定义为 int,所以我不知道为什么 s->data 的输出给出负值。

typedef struct state { int x, y, tx, ty; unsigned char tool; unsigned int start, data; bool end;} state;

void dataCommand(int operand, state *s) {
    // shifts bits of current data fields six positions to left
    printf("BEFORE SHIFTING %d\n", s->data);
    s->data = s->data << 6;
    printf("AFTER SHIFTING %d\n", s->data);
    printf("OPERAND IS %d\n", operand);
    // last 6 bits replaced with operand bits of the command
    s->data = (s->data | operand);
    printf("AFTER OR %d\n", s->data);

}

operand为-1时,它实际上是0xffffffff(二进制32)。 所以当你进行 ORing 时,你会得到 32 个仍然是 -1 的。

也许您想做的是屏蔽操作数​​的 6 位:

s->data = (s->data << 6) | (operand & 0b111111);

您必须将 operand 屏蔽为 select 哪些位组合成结果。

-1s->data | operand 表达式中转换为 unsigned int,转换为设置了所有位的值 UINT_MAX,因此 oring operand 设置所有结果中的位,给它一个 UINT_MAX 的值,但是由于你使用 %d 输出值,你得到 -1.

这样修改代码:

typedef struct state {
    int x, y, tx, ty;
    unsigned char tool;
    unsigned int start, data;
    bool end;
} state;

void dataCommand(int operand, state *s) {
    // shifts bits of current data fields six positions to left
    printf("BEFORE SHIFTING %u\n", s->data);
    s->data = s->data << 6;
    printf("AFTER SHIFTING %u\n", s->data);
    printf("OPERAND IS %d (%#x)\n", operand, operand);
    // last 6 bits replaced with operand bits of the command
    s->data = s->data | (operand & 0x3F);
    printf("AFTER OR %u\n", s->data);
}