在AVX寄存器(__m256i)中设置单个位,需要“随机访问".操作员 [英] set individual bit in AVX register (__m256i), need "random access" operator

查看:134
本文介绍了在AVX寄存器(__m256i)中设置单个位,需要“随机访问".操作员的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

因此,我想设置一个__m256i寄存器的单个位.

So, I want to set an individual bit of a __m256i register.

说,我的__m256i包含:[ 1 0 1 0 | 1 0 1 0 | ... | 1 0 1 0 ],如何设置和取消设置第n位?

Say, my __m256i contains: [ 1 0 1 0 | 1 0 1 0 | ... | 1 0 1 0 ], how do I set and unset the n-th bit?

推荐答案

这是功能的实现,可以在向量内设置单个位:

This is an implementation of function which can set individual bit inside a vector:

#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;
}

这篇关于在AVX寄存器(__m256i)中设置单个位,需要“随机访问".操作员的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆