位移 - 移位移位值

osi*_*ixy 3 c++ bit-manipulation arduino bit-shift shift

我试图做一个更长的功能,但它的行为非常奇怪.我试图找出问题所在,我已经找到了这个有缺陷的部分.

这个程序是为Arduino制作的,但这种现象可能出现在其他环境中.我试图进行大量搜索,但我找不到解决方案.

所以,我的马车部分:

为什么这两个代码不能给出相同的结果?
如何在没有额外变量的情况下构建单行函数,
但是像"代码1"一样操作?

结果:

  • 代码1:0b00101100
  • 代码2:0b01101100

源代码:


代码1 :(正确操作,但不是一行)

#include <binary.h>

const byte value=B00110110;
byte buffer,result;

void setup(){
  Serial.begin(115200);

  buffer = (value << 3);
  result = (buffer >> 2);

  Serial.println(result,BIN);
}

void loop(){
}
Run Code Online (Sandbox Code Playgroud)

它给出:0b00101100


代码2 :(不正确的操作,但一行)

#include <binary.h>

const byte value=B00110110;
byte result;

void setup(){
  Serial.begin(115200);

  result = ((value << 3) >> 2);

  Serial.println(result,BIN);
}

void loop(){
}
Run Code Online (Sandbox Code Playgroud)

它给出:0b01101100


das*_*ght 5

通过屏蔽删除额外的位0xFF:

result = (((value << 3) & 0xFF) >> 2);
Run Code Online (Sandbox Code Playgroud)

你也可以在一系列班次后修剪高三位:

result = 0x1F & ((value << 3) >> 2);
Run Code Online (Sandbox Code Playgroud)

根据语言规范,默认整数提升应用于在移位之前移位操作数,并且操作的结果是第一操作数的提升类型.

5.8.1操作数应为整数或枚举类型,并执行整体促销.结果的类型是提升的左操作数的类型.

如果整数类型可以适合int,那么int是促销的结果.向左移动时,最重要的位"溢出"到上半部分int.你的第一个片段通过分配回来切断它们byte; 你可以通过屏蔽结果来获得相同的结果0xFF.

链接到ideone.