相关疑难解决方法(0)

如何有效地解交织比特(逆莫顿)

这个问题:如何解交织比特(UnMortonizing?)有一个很好的答案,可以提取莫顿数的两半中的一个(只是奇数位),但我需要一个解决方案来提取两个部分(奇数位和尽可能少的操作.

对于我的使用,我需要采用32位int并提取两个16位整数,其中一个是偶数位,另一个是奇数位右移1位,例如

input,  z: 11101101 01010111 11011011 01101110

output, x: 11100001 10110111 // odd bits shifted right by 1
        y: 10111111 11011010 // even bits
Run Code Online (Sandbox Code Playgroud)

似乎有很多解决方案使用带有幻数的移位和掩码来生成Morton数(即交错位),例如Binary Magic Numbers的Interleave位,但我还没有发现任何反向(即去交错) .

UPDATE

在重新阅读Hacker's Delight中关于完美洗牌/洗牌的部分后,我找到了一些有用的例子,我改编如下:

// morton1 - extract even bits

uint32_t morton1(uint32_t x)
{
    x = x & 0x55555555;
    x = (x | (x >> 1)) & 0x33333333;
    x = (x | (x >> 2)) & 0x0F0F0F0F;
    x = (x | (x >> 4)) & 0x00FF00FF;
    x = …
Run Code Online (Sandbox Code Playgroud)

bit-manipulation z-order-curve

18
推荐指数
3
解决办法
6499
查看次数

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

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

标签 统计

bit-manipulation ×2

z-order-curve ×2

c ×1

c++ ×1