我用整数类型变量表示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:我使用此打包的原因是因为我在网格之间进行按位操作以搜索组合。
答案 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,因此它适用于您提供的示例。