所以,我想设置 __m256i
寄存器的单个位。
比如说,我的 __m256i
包含:[ 1 0 1 0 | 1 0 1 0 | 1 0 1 0 ... | 1 0 1 0]
,如何设置和取消设置第 n 位?
最佳答案
这是一个可以在向量内设置单独位的函数的实现:
#include <immintrin.h>
#include <assert.h>
void SetBit(__m256i & vector, size_t position, bool value)
{
assert(position <= 255);
uint8_t lut[32] = { 0 };
lut[position >> 3] = 1 << (position & 7);
__m256i mask = _mm256_loadu_si256((__m256i*)lut);
if (value)
vector = _mm256_or_si256(mask, vector);
else
vector = _mm256_andnot_si256(mask, vector);
}
int main(int argc, char* argv[])
{
__m256i a = _mm256_set1_epi8(-1);
SetBit(a, 54, false);
__m256i b = _mm256_set1_epi8(0);
SetBit(b, 54, true);
return 0;
}
关于x86 - 设置 AVX 寄存器(__m256i)中的各个位,需要 "random access"运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39475525/