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

26 篇文章 0 订阅
3 篇文章 0 订阅

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


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值