128位整数之间的按位运算

时间:2013-09-10 18:02:38

标签: c bit-manipulation sse logical-operators

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

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

然后,我想计算

a & b;

此处a在计算机中表示为64位数4369 = 100010001001,而b = 56481 = 1101110010100001则相同,我计算a & b,它仍然是64-位数由a和b之间的逐位逻辑AND给出:

a & b = 1000000000001

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

1 个答案:

答案 0 :(得分:5)

是的,SSE2具有128位按位AND - 您可以通过C或C ++中的内在函数使用它,例如

#include "emmintrin.h"          // SSE2 intrinsics

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

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

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

你甚至可以在Haswell和后来的具有AVX2的CPU上执行256位AND:

#include "immintrin.h"          // AVX2 intrinsics

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

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

在这种情况下,相应的指令是VPAND