c - 如何编写将 0xFF 置于匹配通道中的 SWAR 比较?
问题描述
我正在尝试编写一个 SWAR 比较相等操作,uint64_t
假装是uint8_t
. 根据 Hacker's Delight 和 Bit Twiddling Hacks 中的技术,我设法达到的最接近的结果如下:
uint64_t compare_eq (uint64_t x, uint64_t y) {
uint64_t xored = x ^ y;
uint64_t mask = 0x7F * 0x0101010101010101ULL;
uint64_t tmp = (xored & mask) + mask;
return ~(tmp | xored | mask);
}
但是,这会放入0x80
匹配的0x00
“车道”和不匹配的“车道”,而我想要匹配的“车道”和不0xFF
匹配0x00
的“车道”。是否可以在没有分支的情况下编写它?
解决方案
作为记录,这只是计算非零字节中的高位(少一条指令)与@njuffa 和@Nate Eldredge 的评论(可能比4386427 的答案更有效)的一种变体。
uint64_t compare_eq (uint64_t x, uint64_t y) {
uint64_t xored = x ^ y;
uint64_t mask = ((((xored >> 1) | 0x8080808080808080) - xored) & 0x8080808080808080);
return (mask << 1) - (mask >> 7);
}
推荐阅读
- file - 如何使用批处理脚本生成类似于保存在一个特定位置的文件的多个文件
- java - 无法使用改造设置标题
- python - 通过 CGI 输出 JSON
- javascript - 如何使用 Selenium WebDriver Java 处理基本浏览器身份验证?
- html - 如何设置从
- python - 过滤单元格中有数组的熊猫数据框
- c++ - 无法打开文件'sfml-system-d.lib' - C++
- delphi - Delphi Indy OPENSSL_Uplink 异常
- entity-framework - 嵌套查询实体框架
- git - 如何 rebase 到 master 而不是 git pull origin master?