摘要由CSDN通过智能技术生成
一个byte由8个二进制位构成1个字节,即1Byte=8Bit
其中左边是高位,右边是低位。
high_four = (byte & 0xf0) >> 4; (0xf0=11110000)
low_four = byte & 0x0f; (0x0f=00001111)
0&1=0,1&1=1。所以byte&0x0f就是byte&00001111。不管byte的高四位是多少,&上0x0f的高四位(0000)之后,都是0。不管
byte的低四位是多少,&上0x0f的低四位(1111)之后,都会保存原值。
比如byte是11010111。byte的高四位是1101。&上0x0f的高四位0000之后,得到的值是0000。因为1&0=0,0&0也等于0。
byte的低四位是0111。&上0x0f的低四位1111之后,得到的值是0111。也就是原来的值。所以11010111&0x0f就是00000111。也就是把byte
的高四位变成0,低四位保持原值。所以取低四位的值就是byte&0x0f。
要取得byte的高四位。就是byte & 0xf0也就是11010111&11110000=11010000。然后再右移四位。变成1101。
(通过debug发现。如果右移的数据里面都是0的话,比如11010000右移四位数,就是右移了4个0。那么,左边就会补0变成了00001101。
如果11010111没有&11110000就直接右移4位的话,会变成1101.但是前面补位的变成了1。所以不是00001101而是11111101)
大小端问题,是指在内存中(注意是内存,不是硬盘)以 字节为单位的排列顺序,与cpu和操作系统有关,操作系统可以选择大小端,java默认读取按大端读取。
大端:高位存在低地址,低位存在高地址;
小端:高位存在高地址,低位存在低地址;
举个例子,从内存地址0x0000开始有以下数据
0x0000 0x12
0x0001 0x34
0x0002 0xab
0x0003 0xcd
如果我们去读取一个地址为0x0000的四个字节变量:
若字节序为big-endian,则读出结果为0x1234abcd;
若字节序位little-endian,则读出结果为0xcdab3412.
如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为:
big-endian little-endian
0x0000 0x12 0xcd
0x0001 0x23 0xab
0x0002 0xab 0x34
0x0003 0xcd 0x12
Intelx86系列以及ARM系列CPU都是little-endian的字节序.
java 中有两个byte ,byte b[]=[0xcd,0xab],按小端读取就变成[0xab,0xcd]
还不懂? 再解释一遍:以下是另一位大佬的解释
一、高地址和低地址
二、高字节低字节
如int a=16777220,化为十六进制是0x01 00 00 04,则04属于低字节,01属于高字节。
三、大小端模式
(1)如果a在内存中的存放顺序为下图(即低字节存放在高地址),则为大端模式
(2)如果a在内存中的存放顺序为下图(即低字节存放在低地址),则为小端模式
(3)如何互换(通过移位操作再或)
四、存放顺序
数据在内存中存放的原则
(1)一个整数类型内部
低地址存储低位,高地址存储高位。比如int a=1,则存储情况为0000(高地址) 0000 0000 0001(低地址)。
(2)若干个局部变量(在栈中存储的)
先定义的高地址,后定义的低地址。
(3)类、结构体或数组的元素
先定义的低地址,后定义的高地址。