从32位int解交织比特的最有效方法是什么?对于这种特殊情况,我只关注奇数位,尽管我确信将两个集合的任何解决方案概括为简单.
例如,我想转换0b01000101成0b1011.什么是最快的方式?
编辑:
在这个应用程序中,我可以保证偶数位都是零.我可以利用这个事实来提高速度或减少空间吗?
我需要以偶数索引落在低位字节中的方式对16位无符号整数进行混洗,奇数索引落在高位字节中.
input:
fedcba98 76543210 (contiguously numbered)
output:
fdb97531 eca86420 (even and odd separated)
Run Code Online (Sandbox Code Playgroud)
我的代码目前看起来像这样:
typedef unsigned short u16;
u16 segregate(u16 x)
{
u16 g = (x & 0x0001);
u16 h = (x & 0x0004) >> 1;
u16 i = (x & 0x0010) >> 2;
u16 j = (x & 0x0040) >> 3;
u16 k = (x & 0x0100) >> 4;
u16 l = (x & 0x0400) >> 5;
u16 m = (x & 0x1000) >> 6;
u16 n = (x …Run Code Online (Sandbox Code Playgroud) 关于您知道哪些可能相关的数值方法的任何方法,请在此处发布!
我有一个values每个集合的数组,每个值的索引对应于值绑定的集合,因此我将集合表示为一个整数,其中元素表示位位置,例如,其中包含元素1的集合是表示为...001其中1是LSB.
所以集合只是一个索引并且从不存储,它是动态生成的,它是导致数组中代表集合值的索引的关键.
我所做的是给定一个集合,是任何成对不相交子集的总和值大于该集合的值.例如,如果set 0111的值为3,其中两个子集的值为0100 = 2和0011 = 2,那么这种拆分更有利.我为集合的所有子集执行此操作.
给定三个代理并且排序是集合数字表示.
val[8] = {0,1,2,4,3,2,4,2} the values is not important, only how they are ordered
0 0 0 0 1 1 1 1 MSB bit representation of the index
0 0 1 1 0 0 1 1
0 1 0 1 0 1 0 1 LSB
Run Code Online (Sandbox Code Playgroud)
111的最佳分裂是011和100,总和为7.因此,为了得到仅包含第一个元素ergo 001的集合的值,你将val [1]设置为与元素1和3(101)的集合,你把val [5].
按基数分组时如何排序val数组
val[8] = {0,1,2,3,4,2,4,2}
0 0 0 1 …Run Code Online (Sandbox Code Playgroud) 第一个函数将[x,y]编码为64位宽的Morton代码,其中x和y是32位宽整数,使用Binary Magic Numbers的Interleave位.
反向功能是什么?
void xy2d_morton_64bits(uint64_t x, uint64_t y, uint64_t *d)
{
x = (x | (x << 16)) & 0x0000FFFF0000FFFF;
x = (x | (x << 8)) & 0x00FF00FF00FF00FF;
x = (x | (x << 4)) & 0x0F0F0F0F0F0F0F0F;
x = (x | (x << 2)) & 0x3333333333333333;
x = (x | (x << 1)) & 0x5555555555555555;
y = (y | (y << 16)) & 0x0000FFFF0000FFFF;
y = (y | (y << 8)) & 0x00FF00FF00FF00FF;
y = (y | (y …Run Code Online (Sandbox Code Playgroud) 有没有一种相对便宜的方法将存储在 a 中的 16x16 位矩阵的四个边(第 0 行和第 15 行,以及第 0 行和第 15 列)提取到 a__m256i的四个 16b 通道中__m256i?我不关心输出到哪个通道,或者寄存器的其余部分是否有垃圾。轻度偏好所有这些都处于下半部分,但只是轻度。
提取“顶部”和“底部”很容易 - 只需向量的第一个和最后 16b 个元素即可完成 - 但侧面是另一回事。您需要每个 16b 元素的第一位和最后一位,这会变得很复杂。
您可以使用完整的位转置来完成此操作,如下所示:
// Full bit-transpose of input viewed as a 16x16 bitmatrix.
extern __m256i transpose(__m256i m);
__m256i get_edges(__m256i m) {
__m256i t = transpose(m);
// We only care about first and last u16 of each
// m = [abcdefghijklmnop]
// t = [ABCDEFGHIJKLMNOP]
m = _mm256_permutevar8x32_epi32(m, _mm256_set_epi32(0x0, 0x0, 0x0, 0x0, 0x0, 0x0, …Run Code Online (Sandbox Code Playgroud) 第一个函数将 [x, y] 编码为 64 位宽 Morton 代码,其中 x 和 y 是使用二进制幻数交错位的 32 位宽整数。
反向函数是什么?
void xy2d_morton_64bits(uint64_t x, uint64_t y, uint64_t *d)
{
x = (x | (x << 16)) & 0x0000FFFF0000FFFF;
x = (x | (x << 8)) & 0x00FF00FF00FF00FF;
x = (x | (x << 4)) & 0x0F0F0F0F0F0F0F0F;
x = (x | (x << 2)) & 0x3333333333333333;
x = (x | (x << 1)) & 0x5555555555555555;
y = (y | (y << 16)) & 0x0000FFFF0000FFFF;
y = (y …Run Code Online (Sandbox Code Playgroud) 我有 int 136970250 (1000 0010 1010 0000 0000 0000 1010) -> 我需要删除所有奇数位(1,3,5,7...)
1000 0010 1010 0000 0000 0000 1010 -> 10 0111 0000 0011 (9987) - 因为这些位没有信息。
怎么做?