现在的位置: 首页 > 综合 > 正文

Android中的位运算的例子(一)

2013年07月12日 ⁄ 综合 ⁄ 共 843字 ⁄ 字号 评论关闭

原创文章,如有转载,请注明出处: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);

抱歉!评论已关闭.