高位-丢弃它们并向右移动
High Order Bits- Drop them and shift right
作为上一个问题的后续:
假设您有一个uint64_t,并且只关心uint64_t
中每个字节的NON高位。像这样:
0111.1111 0111.1111 0111.1111 0111.1111 0111.1111 0111.1111 0111.1111 0111.1111
--->
0000.0000 1111.1111 1111.1111 1111.1111 1111.1111 1111.1111 1111.1111 1111.1111
有没有比屏蔽每个部分、向右移动并添加到下一个部分更快的方法将每个7位部分向右移动?
不幸的是,我没有允许快速和通用比特收集的热门AVX指令;我只能访问SSE2指令。
您可以使用三个掩码和移位来完成此操作。
u64 val;
// remove bits at 7, 23, 39, 47
u64 odd8 = val & 0x7f007f007f007f00L;
u64 even8 = val & 0x007f007f007f007fL;
val = ( odd8 >> 1 ) | even8;
// remove bits at 15-16, 23-24
u64 odd16 = val & 0x3FFF00003FFF0000L;
u64 even16 = val & 0x00003FFF00003FFFL;
val = ( odd16 >> 2 ) | even16;
// remove bits at 31-35
u64 odd32 = val & 0x0FFFFFFF00000000L;
u64 even32 = val & 0x000000000FFFFFFFL;
val = ( odd32 >> 4 ) | even32;
相关文章:
- 为什么在这种情况下调用非常量右值移动构造函数?
- 右移布尔值在C++
- C++模板成员初始化:用右值移动构造,但用左值移动引用
- 何时右移操作>>移位符号位,何时不?
- 这个右移是如何工作的:字符串流>>无符号的int>>无符号的int?
- C++中的负数右移运算符
- C++ 尝试将数字右移 32 会得到两种不同的结果
- 对已签名数据进行逻辑右移
- 右移速度与左移相同的速度测试位
- 右移无法正常工作
- 为什么将 int a=1 移到左 31 位然后向右移 31 位,它变成 -1
- 当 b 大于 a 中的位数时右移(a >> b)的未定义行为?
- 为什么无符号的 int 右移总是用"1"填充
- 重载左移和右移运算符(cin和cout)
- 在c++中,取一个整数数组(arr[])、其长度(N)和元素数右移(M):
- 右移g++时出现意外结果
- 如果计数大于类型的宽度,则为右移未定义的行为
- 使用左移或右移计算对数基数 n
- static_assert签名的右移具有两个补码行为是否合法?
- 在C/C++中,左移或右移零点实际上会生成一条指令