gpt4 book ai didi

c++ - 位移位 - 移动移位值

转载 作者:太空狗 更新时间:2023-10-29 19:53:41 27 4
gpt4 key购买 nike

我试图制作一个更长的函数,但它表现得很奇怪。我曾尝试找出问题所在,并找到了有问题的部分。

这个程序是为 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(){
}

它给出: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(){
}

它给出:0b01101100


最佳答案

通过用0xFF 屏蔽来移除多余的位:

result = (((value << 3) & 0xFF) >> 2);

您还可以在移位序列后修剪掉高三位:

result = 0x1F & ((value << 3) >> 2);

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

5.8.1 The operands shall be of integral or enumerated type and integral promotions are performed. The type of the result is that of the promoted left operand.

如果一个整型可以放入一个int,那么int就是提升的结果。当您向左移动时,最高有效位“溢出”到 int 的上半部分。您的第一个片段通过分配回 byte 来切断它们;您可以通过使用 0xFF 屏蔽结果来获得相同的结果。

Link to ideone .

关于c++ - 位移位 - 移动移位值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11656794/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com