Protocol Buffers编码特点

    下半年的KPI中,有一条是推动Protocol Buffers在部门中的应用。对于java来说,已经没什么问题,用官方的代码生成编译器已经能很好的解决问题。但对于PHP来说,并没有太好的第三方插件,要么是很不完善,要么就是性能太差。暂时的打算是写一个php扩展,给其他人使用。
     对于Protocol Buffers,之前有过一些研究,写过一篇博文 Protocol Buffers的应用与分析,但时隔境迁不少东西已经忘记了,同时对一些细节也了解得不是太深入。
    下午的时候,回顾了一下PB的varints编码,其中有一块对于负数的编码采用了ZIGZAG的方式(无符号0~4294967295)。方式为(n << 31 ^ n >> 1),对于移位操作并不太熟悉,因此不大明白这块转换是如何完成的。
    首先n << 31:对于正int来说,移位完将变成0;而对于负int来说,移位完,所有的bit位都会变成1(>>的特点是每次移动补上最高位,而<<<则是补0
    之后异或n >> 1:对于正int来说,异或的是全0,结果相当于原来的值乘以2;对于负int来说,异或的是全1,结果相当于求反,于是值便是原来的值去掉符号位后减1

你可能感兴趣的:(pb)