osi*_*ixy 3 c++ bit-manipulation arduino bit-shift shift
我试图做一个更长的功能,但它的行为非常奇怪.我试图找出问题所在,我已经找到了这个有缺陷的部分.
这个程序是为Arduino制作的,但这种现象可能出现在其他环境中.我试图进行大量搜索,但我找不到解决方案.
为什么这两个代码不能给出相同的结果?
如何在没有额外变量的情况下构建单行函数,
但是像"代码1"一样操作?
结果:
源代码:
代码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
通过屏蔽删除额外的位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
.
归档时间: |
|
查看次数: |
933 次 |
最近记录: |