视音频滤镜及编码中的“>>”与“<<”符号是干什么用的
最近啃了HEVC帧内编码论文和公开课,看3-tap滤镜,以及strong intra smoothing滤镜时遇到了这样的算式:
这种符号看起来就很常用。其实“>>”与“<<”在计算机编程中代表向右的二进制位移操作(bitwise shift)中的算术位移(arithmetic shift),是一种为计算机优化的乘除法。
- 二进制01左移五次,即
1 << 5
得10 00 00;代表了十进制下1×2⁵
。 - 二进制
x >> 2
就是十进制下的x ÷ 2²
;由于计算机直接做了位移操作,所以可以直接编译成x86/64/arm指令集;但...只能乘除二次方的缺点也摆在那了(_ _ )
- 算术位移 arithmetic shift
适合保留正负号,也就是说最高位的bit视为正负号并进行保留(如果向左位移则无视),最接近心算口算脑算和计算(雾),所以被用来代替一部分乘除法,在视音频滤镜上常见; - 逻辑位移logical shift
在移动后空出来的地方插入0,计算机位移序列而非数字的时候常用,在Java中用a >>> n或a <<< n可以直接指定; - 轮回位移/循环位移circular shift
移动后把出界的数插入空出的反方向,或另一种方案是先插到新序列中,等满了再插回到原来的bit中;在密码学中常见。
- 指令集如下
x86/64指令集有movsx(带符移位),movzx(添零移位);arm的mov, lsl逻辑左移,asl算术左移,lsr逻辑右移,asr算术右移,ror循环右移,rrx带扩展循环右移(举例,mov r19,r20,r30, lsl#4代表第30行数据往左逻辑位移4行,结果发到第20和19行里)
wiki - 位移操作,wiki - 正负保留,位移计算器,CSDN - ARM位移指令集
打赏信息
在线丢人,这篇文章有点水但还是求个打赏,支持一下T_T
那么没准就这样