在函数 ape_decode_value_3990 中有这么一段代码 ((x >> 1) ^ ((x & 1) - 1)) + 1; 注释是说转成有符号数。
rice编码是对非负数做编码的,因此,在编码前需要把负数转成正数,ape中的转换规则为:
从有符号数y到无符号数x的转换
x = 2y - 1 if y > 0
x = 2 abs(y)= -2y if y <= 0
示例:
y | 0 | 1 | -1 | 2 | -2 | 3 | -3 | 4 | -4 | 5 | -5 | 6 | -6 | 7 | -7 | 8 | -8 | 9 | -9 |
x | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
即偶数用来表示负数,奇数用来表示正数。
说明:
1) 正数时(最后一个bit是1),表示的实际值是去掉最后一位(符号位),剩下的部分加1.
例如 101 (二级制),表示的 3这个正数,运算过程就是 101 >> 1 + 1( 101右移一位后加1).
2) 负数时(最后一个bit是0),去掉最后一位就是实际值(再加上符号)
从无符号数x到有符号数y的转换
y = (x+1) / 2 如果y表示一个正数
y = -x/2 如果y表示一个非正数
按照如上公式编写c代码可以是如下:</