参考:https://blog.csdn.net/iamgamer/article/details/79354617

其中有两个位运算,一个是>>,一个是&。

0xff的作用一:

十六进制0xff的长度是一个字节,即八位,二进制为:1111 1111,那么一个 8bit 数与1111 1111与运算还是这个数本身,但是一个16bit 数与 0xff就被截断了,比如 1100110011001100 & 0xff结果为 11001100。那如果想不被截断怎么办?把0xff扩展为二个字节即:0xffff,那么以此类推,0xffffff,0xffffffff都出来了。

0xff的作用二:

java专属,由于java没有unsigned类型,所以为了适应与其他语言二进制通讯时各种数据的一致性,需要做一些处理。

最直观的例子:int a = -127 & 0xFF ; // 等同于 unsigned int c = 129; (这里的-127与129是字节,只为了直观而写的具体数字)

这里要严格说明一点:再32位机器上,0xff实际上是 0x00000000 00000000 00000000 11111111,

而-127是 11111111 11111111 11111111 10000001 (补码形式), 那么-127 & 0xff的结果自然是

00000000 00000000 00000000 10000001 即 129.

简而言之,该作用主要是为了将 有符号数转换为无符号数。

>>8的作用:

这个是根据需求而定的,可以是>>8也可以是>>16,>>24,等等

而跟 & 0xff运算的意义其实就是截断,将123456的高位右移8位,通过0xff截取出来。实际意义就是取字节,比如一个4字节的数,需要将每个字节内容取出来转换出目标数据,那么通过>> 并且 &0xff 运算 就可以去除想要的部分。

再详细点:4字节 ,32 位,按照大端方式排列,

最高位                                         最低位

11111111 10101010 11000011 10101010

最高位8字节要移到最低位那么,这个8个字节>>(3*8),然后与0xff运算,取出,然后后续得>>(2*8) & 0xff ;>>(1*8) & 0xff,均可取出。

再来一个简单的例子巩固基础:

		int   a   =   1234567890;
byte b1[] = new byte[4];
// b1[0] = (byte) (a & 0xff);
// b1[1] = (byte)((a >> 8) & 0xff);
// b1[2] = (byte)((a >> 16) & 0xff);
// b1[3] = (byte)((a >> 24) & 0xff);
b1[0] = (byte)((a >> 24) & 0xff);
b1[1] = (byte)((a >> 16) & 0xff);
b1[2] = (byte)((a >> 8) & 0xff);
b1[3] = (byte) (a & 0xff); int b2 = (b1[0]& 0xff) <<24 | (b1[1] & 0xff)<<16 | (b1[2] &0xff)<<8| (b1[3]& 0xff);
int b3 = (b1[0]) <<24 | (b1[1])<<16 | (b1[2])<<8| (b1[3]);
System.out.println(b2);//正确结果
System.out.println(b3);//错误结果,没有做有符号转无符号操作,导致结果不对。

将int a转换成字节,一般情况下,int 4字节,那么需要4个byte来保存,又因为java是大端排序,那么byte[0]为最高位,所以需要>>24,这么一个个的把a的4个字节取出存入byte数组中,这里0xff不仅截断,而且还将有符号转换成了无符号。

那么将字节转换回去就不一样了,不是截断而是融合 ,因此需要将& 改为 |,并且还得把每个字节移到所在实际位置,比如byte[0]是最高位,因此还得将其移到4个字节的头部即需要<<24,那么后续得以此类推。一个完成的int32型就出现了。但是由于java的原因,再做位移操作之前还是不能少了有符号转无符号操作。

至此,我想读者朋友,你应该完全理解了。

最新文章

  1. Vitamio
  2. sqlserver权限体系(上)
  3. CSS样式优化
  4. 一步步构建自己的AngularJS(2)——scope之$watch及$digest
  5. Linux Commands intro1
  6. WPFのTopMost属性的应用
  7. iOS - OC NSValue 值
  8. LotteryDrawing
  9. WPF数据双向绑定
  10. binary-tree-maximum-path-sum(mock)
  11. Android开源项目发现--- 工具类数据库ORM篇(持续更新)
  12. The ultimate jQuery Plugin List(终极jQuery插件列表)
  13. C#之out与ref的共性与区别以及用法
  14. Android(Lollipop/5.0) Material Design(六) 使用图像
  15. Spring.Net+Nhibernate+Asp.Net Mvc 框架
  16. JPlayer Jquery video视频插件
  17. linux 下文件误删恢复
  18. 【图文详解】HDFS基本原理
  19. Serverless架构
  20. Hdoj 1312.Red and Black 题解

热门文章

  1. 让这个Java语言的开源商城系统火起来
  2. UniRapidJson
  3. webstorm编写vue、react 将大驼峰组件命名转换成短横杠命名
  4. 【Go语言入门系列】(九)写这些就是为了搞懂怎么用接口
  5. Codeforces Round #669 (Div. 2)/Codeforces1407 ABCD
  6. BIO应用-RPC框架
  7. windows上部署rabbitmq遇到的一些问题及解决方法
  8. 通过调用标识符确定this
  9. Blocks(POJ 3734)
  10. python3 变量