麻烦理解位移位如下
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 哪些位组合成结果。
-1
在 s->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);
}
所以我写了下面的代码,它接受一个 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 哪些位组合成结果。
-1
在 s->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);
}