求最右边的第一个1的数组

来源:互联网 发布:php中级面试题 编辑:程序博客网 时间:2024/06/15 11:57

求一个字节(8位)表示的数字中查找最右边第一个非0的数字的位置,该数组如何解析呢?

static const uint8 rightmost_one_pos[256] = {    0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,    7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0};

解析:此数组对应了8位,也就是一个字节的数字对应的最右边非0的第一个bit的位置。
对应数组【0~7】位。
假如:00000000,没有最右边的,对应数组组下标为0
00000001,最右边非0为第1个数,对应数组下标为1
00000010,最右边非0为第2个数, 对应数组下标为2
00000011,最有表非0为第1个数,对应数组下标为3
00000100,最右边非0为第3个数,对应数组下标为4
……
可以看出来,数组中下标对应的数字比我们计算的小1。
会在后来讲解。
所以,此数组中保存的数字,使我们计算的最右边非0的数字的结果。

0 0
原创粉丝点击