视音频滤镜及编码中的“>>”与“<<”符号是干什么用的

A@NAZOrip
A@NAZOrip 2022年01月22日
  • 在其它设备中阅读本文章

最近啃了HEVC帧内编码论文和公开课,看3-tap滤镜,以及strong intra smoothing滤镜时遇到了这样的算式:

bitwiseshift.png

这种符号看起来就很常用。其实“>>”与“<<”在计算机编程中代表向右的二进制位移操作(bitwise shift)中的算术位移(arithmetic shift),是一种为计算机优化的乘除法。

  • 二进制01左移五次,即1 << 5得10 00 00;代表了十进制下1×2⁵
  • 二进制x >> 2就是十进制下的x ÷ 2²;由于计算机直接做了位移操作,所以可以直接编译成x86/64/arm指令集;但...只能乘除二次方的缺点也摆在那了(_ _ )
三种二进制位移bitwise shift操作:
  • 算术位移 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
pp_tip_qrcode.png

那么没准就这样