以DIA搜索为例,
从代码逻辑上看,就是先从一个起始位置,然后不断的逼近最佳的cost的mv,起始位置已经在函数前面运算的candidate中选择了最佳的存入到了bcost的低4bits。
但是这里的m偏移值运算 +1, +3, +4 +12就有点令人费解了。
我们就来分析下这几个数值是如何得到的?
先列出二进制
1 01
3 11
4 100
12 1100
每次搜索4个方向,坐标分别为 (-1, 0) (1, 0) (0, -1) (0, 1)
x是高2bit ,y是低2bit
当偏移值为1
bmx -= 0
bmy -= 1 移动到(0, -1)这个位置
偏移值为3
bmx -= 0
bmy -= 3 注意看代码,3 强制转型为int32_t,就是减去11的补码 -1 就是+1。
偏移值为4
bmx -= 1
bmy -= 0
偏移值为12
bmx -= 3. +1
bmy -= 0
因此可以看出来,这里之所以这样写,是因为不需要判断起始点移动的方向,直接写 减法就好了,减少一条判断命令。加快搜索速度