- 论坛徽章:
- 14
|
除了遍历每一个bit外,只想到一个办法
先做一个数组 buf_[256]
其中每一项保存索引值的最大连续比特为1的数目
比如 181 的二进制为 10110101,那我们就保存 buf_[181] = { {-,7}, {4,5}, {0,-} }
比如 192 的二进制为 11000000,那我们就保存 buf_[128] = { {-,6}, {x,x}, {x,x} }
也就是'-'代表最左边或最右边,能和别人相接,'x'代表没有,中间的{4,5}表示既不是最左边也不是最右边的连续1最大数目。
假设你在纸上已经做好了0-255的所有计算,得到
static unsigned map_[256][3][2] = { …… };
然后将你这个32bits的数字分解成4个8bits的数字,通过map_拼接起来,比如
{ {-,7}, {4,5}, {0,-} }(右边第1个8bits) 和 { {-,6}, {x,x}, {x,x} }(右边第0个8bits) 拼接起来就是 { {-,15}, {8,6}, {x,x} }
假设最终表达式为 { {-,15}, {8,6}, {1,-} },我们在31-15,8-6,1-0中取最大值,即31-15,即第15位到31位都是1 |
|