bit-manipulation - 给定无符号操作数,计算 `(x - y) / z` 的有符号结果的按位快捷方式
问题描述
我正在寻找一种简洁的方法(很可能是“按位快捷方式”)来计算表达式的有符号值(x - y) / z
,给定无符号操作x
数y
和z
.
这是一个“有点真实有点伪”的代码,说明了我目前正在做的事情(请不要介意实际语法是“100% 完美的 C 或 C++”):
int64 func(uint64 x, uint64 y, uint64 z)
{
if (x >= y) {
uint64 result = (x - y) / z;
if (int64(result) >= 0)
return int64(result);
}
else {
uint64 result = (y - x) / z;
if (int64(result) >= 0)
return -int64(result);
}
throwSomeError();
}
请假设我手头没有更大的类型。
我很乐意阅读有关如何使其更简单/更短/更整洁的任何想法。
解决方案
有一个捷径,通过对条件否定使用按位技巧两次(一次用于绝对差,然后再次恢复符号)。
我猜我会使用一些类似的非完美 C-ish 语法来匹配问题。
首先得到一个所有位都设置为 iff 的掩码x < y
:
uint64 m = -uint64(x < y);
(x - y)
并且-(y - x)
实际上是相同的,即使在无符号算术中,也可以通过使用二进制补码的定义来完成条件否定:-a = ~(a - 1) = (a + (-1) ^ -1)
. (a + 0) ^ 0
当然又等于a
,所以什么时候m
是-1,(a + m) ^ m = -a
什么时候m
是零,是a
。所以这是一个有条件的否定。
uint64 absdiff = (x - y + m) ^ m;
然后像往常一样除,并通过另一个条件否定来恢复符号:
return int64((absdiff / z + m) ^ m);
推荐阅读
- php - 将 mailchimp 与 CRM 集成
- quill - QuillJs 处理大文档时速度很慢
- css - CSS - 带有边框半径的动画比例
- python - 在Python中每行打印一个编号列表
- ios - 只有最后 2 个值的索引超出范围?
- html - 如何在容器外显示导航栏下拉菜单?
- mysql - MacOS Mojave 上的 WordPress 数据库连接错误
- webrtc - Edge WebRTC 加入了显示旧帧的媒体流
- javascript - 单击我的选择中的另一个项目时如何访问 json 对象的其他属性?
- python-3.x - How to plot multi-index, categorical data?