相关疑难解决方法(0)

如何解交织比特(UnMortonizing?)

从32位int解交织比特的最有效方法是什么?对于这种特殊情况,我只关注奇数位,尽管我确信将两个集合的任何解决方案概括为简单.

例如,我想转换0b010001010b1011.什么是最快的方式?

编辑:

在这个应用程序中,我可以保证偶数位都是零.我可以利用这个事实来提高速度或减少空间吗?

bit-manipulation z-order-curve

23
推荐指数
1
解决办法
3089
查看次数

我怎样才能有效地改变比特?

我需要以偶数索引落在低位字节中的方式对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)

c c++ bit-manipulation z-order-curve

18
推荐指数
5
解决办法
5127
查看次数

自下而上设置生成和订购

关于您知道哪些可能相关的数值方法的任何方法,请在此处发布!

背景

我有一个values每个集合的数组,每个值的索引对应于值绑定的集合,因此我将集合表示为一个整数,其中元素表示位位置,例如,其中包含元素1的集合是表示为...001其中1LSB.

所以集合只是一个索引并且从不存储,它是动态生成的,它是导致数组中代表集合值的索引的关键.

我所做的是给定一个集合,是任何成对不相交子集的总和值大于该集合的值.例如,如果set 0111的值为3,其中两个子集的值为0100 = 20011 = 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)

c arrays algorithm cuda dynamic-programming

11
推荐指数
1
解决办法
552
查看次数

2d Morton代码64位解码功能

第一个函数将[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)

c 64-bit z-order-curve

5
推荐指数
1
解决办法
210
查看次数

提取 AVX2 16x16 位矩阵的边缘

有没有一种相对便宜的方法将存储在 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)

c bit-manipulation intrinsics avx2

5
推荐指数
1
解决办法
226
查看次数

2D Morton 解码功能 64 位

第一个函数将 [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)

c z-order-curve

3
推荐指数
1
解决办法
592
查看次数

如何删除 C 中的所有赔率位?

我有 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) - 因为这些位没有信息。

怎么做?

c bit-manipulation bit

3
推荐指数
1
解决办法
1393
查看次数