Android中的位运算的例子(一)
16lz
2021-01-26
原创文章,如有转载,请注明出处:http://blog.csdn.net/yihui823/article/details/6754213
错误代码一
byte[] bs = {1,2,3,4,};//以下代码是不好的代码long num1 = bs[0] < 0 ? (bs[0] + 256) * 256 + bs[1] : bs[0] * 256 + bs[1];long num2 = bs[2] < 0 ? (bs[2] + 256) * 256 + bs[3] : bs[2] * 256 + bs[3];long num = num1 * 65536 + num2; System.out.println(num);
结果应该是不会出问题的。其实bs-byte数组,是一个硬件设备通过socket传入的一组数值。这段代码,我其实看到的第一眼,就应该能理解,其实传入的byte数组,是一个32位的整数。
不难看出,代码的原作者,对java的位运算基本是不理解的。其实原作者应该是很聪明的,这段代码肯定是经过了反复的推敲才得出来的。
其实,这段代码,这么写应该更好:
long numbyte = (bs[0] << 24) | (bs[1] << 16) | (bs[2] <<8) | bs[3];
但是这么写,还是有问题的。从设备过来的4个字节的整数,应该是个无符号整数。而我们做bs[0]<<24的时候,实际上bs[0]是带符号的。我们把bs数组重新改一下数据:
byte[] bs = {
-1,2,3,4,
};
运行出来的结果,就是一个负数,显然不是我们想要的。
也就是说,我们要把byte的第一位,当作数据来操作,而不是当作符号来处理。
修改后的代码:
//左边第一位不是符号位long firstbyte = bs[0];if ((bs[0] & 0x80) != 0) {firstbyte = (bs[0] & 0x7f) | 0x80;}long numbyte = (firstbyte << 24) | (bs[1] << 16) | (bs[2] << 8) | bs[3];System.out.println(numbyte);
更多相关文章
- Android使用SharedPreferences保存数组
- android OpenGLES开发 第五课 纹理映射
- Fragment封装切换
- 编写高效Android代码
- android email 邮件转发 附件不能转发问题的解决
- android中onClick事件的实现
- [Android实例] android登录Web以及登录保持,cookie管理相关
- Android(安卓)Audio代码分析=Audio Strategy
- android中setOnClickListener的那点事