c - 128 位整数之间的按位运算

标签 c bit-manipulation sse logical-operators

我有一个关于使用 128 位寄存器来提高代码速度的问题。考虑以下 C/C++ 代码:我定义了两个 unsigned long long int ab,并给它们一些值。

unsigned long long int a = 4368, b = 56480;

然后,我要计算

a & b;

这里a在计算机中表示为64位数字4369 = 100010001001,同样b = 56481 = 1101110010100001,然后我计算 a & b,它仍然是一个 64 位数字,由 a 和 b 之间的逐位逻辑与给出:

a & b = 1000000000001

我的问题如下:计算机是否有一个 128 位寄存器,我可以在其中执行上述操作,但使用 128 位整数而不是 64 位整数,并且计算机时间相同?更清楚一点:我想通过使用 128 位数字而不是 64 位数字,将我的代码速度提高两倍,e。 G。我想用相同的计算机时间计算 128 个 AND 而不是 64 个 AND(每个位一个 AND)。如果可能的话,你有代码示例吗?我听说上交所注册人可能会这样做,但我不确定。

最佳答案

是的,SSE2 有一个 128 位的按位与 - 您可以通过 C 或 C++ 中的内部函数使用它,例如

#include "emmintrin.h"          // SSE2 intrinsics

__m128i v0, v1, v2;             // 128 bit variables

v2 = _mm_and_si128(v0, v1);     // bitwise AND

或者您可以直接在汇编程序中使用它 - 指令是 PAND

您甚至可以在具有 AVX2 的 Haswell 和更高版本的 CPU 上执行 256 位 AND:

#include "immintrin.h"          // AVX2 intrinsics

__m256i v0, v1, v2;             // 256 bit variables

v2 = _mm256_and_si256(v0, v1);  // bitwise AND

此时对应的指令是VPAND

关于c - 128 位整数之间的按位运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18725928/

相关文章:

android - Android 音乐流媒体应用程序上的致命信号 11

c - C 结构中对齐填充的平台特定位置

assembly - 访问汇编中寄存器的高阶字节

c++ - 跨平台 SIMD 调用可能只用一个可执行文件吗?

c - Arduino定时器库和剩余时间

python - 如何在 C 中合并 Python 库?

c - 设置序数中的位范围

c++ - 如果有人能向我解释这里发生了什么

c++ - SSE4内存比较差异位置

assembly - 即时生成矢量常数的最佳指令序列是什么?