根据掩码合并位序列a和b
Merge bit sequences a and b according to a mask
根据bit twidling hacks网站,操作
unsigned int a; // value to merge in non-masked bits
unsigned int b; // value to merge in masked bits
unsigned int mask; // 1 where bits from b should be selected; 0 where from a.
unsigned int r; // result of (a & ~mask) | (b & mask) goes here
r = a ^ ((a ^ b) & mask);
允许根据掩码合并两个比特序列CCD_ 1和CCD_。我在想:
- 此操作是否有特定/常用名称
- 某个指令集上是否存在此操作的特定程序集指令
我会使用掩码xor方法将其称为位混合。相关:本次问答;A详细解释了这些布尔运算是如何实现这一点的。
在SSE/AVX编程中,基于掩码从一个向量选择性复制到另一个向量被称为混合。SSE4.1添加了类似PBLENDVB xmm1, xmm2/m128, <XMM0>
的指令,其中隐式操作数XMM0控制src的哪些字节覆盖dst中的相应字节。(在没有SSE4.1的情况下,通常会将掩码与两个向量进行AND和ANDNOT运算,并将其进行OR运算;掩码异或技巧的指令级并行性较低,并且可能需要至少与OR方法一样多的MOV指令来复制寄存器。(
还有一个立即数混合指令pblendw
,其中掩码是一个8位立即数,而不是寄存器。有32位和64位立即混合(blendps
,blendpd
,vpblendd
(和可变混合(blendvps
,blendvpd
(。
IDK,如果其他SIMD指令集(NEON、AltiVec、MIPS调用它们的任何指令集等(也调用它们";共混物";是否。
SSE/AVX(或x86整数指令(在AVX512F之前没有提供比通常的逐位XOR/AND更好的东西来进行逐位(而不是逐元素(混合。
AVX512F可以使用单个a
0或vpternlogq
指令执行此函数的逐位版本(或任何其他逐位三元函数(。(d和q元素大小之间的唯一区别是,如果您使用掩码寄存器对目标进行合并掩码或零掩码,但这并没有阻止英特尔制作单独的内部函数,即使是在无掩码的情况下:
__m512i _mm512_ternarylogic_epi32 (__m512i a, __m512i b, __m512i c, int imm8)
及其等价物_epi64版本。
imm8
立即字节是一个真值表。通过使用a、b和c的对应比特作为真值表的3比特索引,独立地确定目的地的每个比特。即CCD_ 14。
当AVX512最终出现在主流台式机/笔记本电脑CPU中时,玩起来会很有趣,但这可能还需要几年的时间。
- 位移操作和位掩码未检测到重复字符
- OpenCV - 带有掩码的absdiff
- 生成前缀位掩码
- 如何从__m64值的 lsb 创建 8 位掩码?
- 如何对无符号长 int 进行位掩码?
- 删除K的背景掩码-意味着Python或C++中的集群/
- 如何在C++中优雅地处理位掩码
- 将uint64_t位掩码转换为 std::布尔数组
- 使输入二进制掩码适应 ITK 网格生成器
- 如何从 getifaddr 读取子网掩码
- 优化从子位掩码生成父位掩码
- 基于模式创建位掩码作为 constexpr
- 使用二进制掩码 C++ ITK 获取感兴趣区域
- C++中的运行时位复制(位掩码)
- 根据 IP 和掩码C++打印所有 IP
- C++设置"blank"或重置 ifstrean (ios) 的异常掩码
- OpenCV 检测带有掩码的斑点
- OPENCV:如何创建多边形形状的掩码
- 递归函数,用于使用位掩码 c++ 显示集合的所有子集
- 根据掩码合并位序列a和b