连接按位运算的正确方法
Correct way to concatenate bitwise operations?
我需要连接一些按位运算,但当前输出似乎是错误的。拆分操作类似于以下内容:
unsigned char a = 0x12
unsigned char x = 0x00;
x = a << 4;
x = x >> 4;
预期成果 x = 0x02;当前结果 x = 0x02;
如果我尝试连接操作,结果不正确:
unsigned char a = 0x12
unsigned char x = 0x00;
x = (a << 4) >> 4;
预期成果 x = 0x02;当前结果 x = 0x12;
提前感谢您的任何建议。
问题是(a << 4)
被转换为 int(通过积分提升(,所以(0x12 << 4) >> 4
本质上是0x12
您要做的是使用static_cast
将(a << 4)
转换回unsigned char
最终代码:
unsigned char a = 0x12;
unsigned char x = 0x00;
x = static_cast<unsigned char>(a << 4) >> 4;
编译器
未对>>和<<操作应用积分提升
你可能会认为
x = (a << 4) >> 4;
将使用字节宽的寄存器进行操作,但编译器在执行移位之前将 char a 提升为 int,保留向左移动的位。
您可以通过执行以下操作来解决此问题:
x = ((a << 4) & 0xff) >> 4;
同样,问题是整体推广会保留位直到最终演员表。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 使用C++中的模板和运算符重载执行矩阵运算
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 何时使用按位运算而不是算术替代方法?
- 连接按位运算的正确方法
- boost::multiprecision:乘以或除以 10 的巨大幂最便宜的方法是什么?类似于 10 次方的位移运算?
- 有没有一种方法可以将阈值运算输出存储在Eigen(C++)中
- 自动获取某些代码段的浮点运算计数的方法
- 对字符串副本执行迭代器运算的更简单方法
- 有没有更优雅的方法来做这些位运算
- 在乘法运算中测试有符号整数溢出的方法