• >>8) & 0xFF中的 >> 和 &0xFF 的作用


    参考: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的原因,再做位移操作之前还是不能少了有符号转无符号操作。

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

  • 相关阅读:
    WM_MOUSEWHEEL消息的处理
    Delphi之TStrings和TStringLists类[转]
    使用mysqladmin命令修改Mysql密码
    AP_发票与预付款核销时预付款带税码
    ORACLE EBS AP发票到付款的数据流
    .关于货币大写的探索
    Oracle SQL 空值排序(Nulls)
    实现主从关系Form中汇总行金额/数量
    巧妙的查看FORM中的 LOV查询语句
    供应商接口的使用
  • 原文地址:https://www.cnblogs.com/MCSFX/p/11027160.html
Copyright © 2020-2023  润新知