如何每x位插入零

时间:2016-03-31 21:24:24

标签: c bit-manipulation bit-shift

我用整数类型变量表示1和0的平方。这是它的样子:

1 1 1 0
0 1 0 0
0 0 0 0
0 0 0 0

相应的整数从右下角到左上角编码,左上角对应2 ^ 0。该网格的整数表示为:0000 0000 0010 0111(2)= 39(10)

网格始终是已知宽度的正方形。在我的代码中,我需要将宽度增加1次,从而将地图更改为:

1 1 1 0 0
0 1 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

这相当于每x =宽度位插入一个0(示例中宽度= 4)。由于整数的大小远大于所需的大小,因此不会发生溢出。

在C中,如何每x位插入一个零?

Edit1:由于此操作将在多个网格上发生很多次,因此应避免循环。

Edit2:我使用此打包的原因是因为我在网格之间进行按位操作以搜索组合。

1 个答案:

答案 0 :(得分:0)

以十进制数中每个第四个位置添加0的方式查看问题。你在十进制中做的是:

1 513 650 -> 105 130 650

你可以看到,你只是保留小于10 ^ 3的数字并将其余数字乘以10.比保留小于10 ^ 7的数字(不是10 ^ 6,因为你已经成倍增加)并且多次拼接右边旁边10 ....

它对二进制文件的工作方式相同。

    #include <iostream>
    #include <cmath>

    int power(int x, int n){
        return n == 1 ?  x :  x*power(x,n-1);
    }

 int main(int argc, char const *argv[])
{
    int n = 4;
    int grid = 1024;
    int grid_len = std::floor(std::log2(grid)) ; // what is the position of last 1, = how long i need to insert 0
    for (int steps = 0; steps*n < grid_len; ++steps)
    {
        std::cout << steps << std::endl;
        int preserve = grid % power(2,n*(steps+1) );
        grid = (grid - preserve) * 2;
        grid += preserve;
    }
    std::cout << grid << std::endl;

    return 0;
}

代码打印71,二进制为1000111,因此它适用于您提供的示例。