Byte 高位/低位简介绍(大端格式/小端格式)

简介: Byte 高位/低位简介绍(大端格式/小端格式)

摘要由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]

还不懂? 再解释一遍:以下是另一位大佬的解释

一、高地址和低地址

image.png

二、高字节低字节

如int a=16777220,化为十六进制是0x01 00 00 04,则04属于低字节,01属于高字节。

三、大小端模式

(1)如果a在内存中的存放顺序为下图(即低字节存放在高地址),则为大端模式

image.png

(2)如果a在内存中的存放顺序为下图(即低字节存放在低地址),则为小端模式
image.png

(3)如何互换(通过移位操作再或)

image.png

四、存放顺序

数据在内存中存放的原则

(1)一个整数类型内部

低地址存储低位,高地址存储高位。比如int a=1,则存储情况为0000(高地址) 0000 0000 0001(低地址)。

(2)若干个局部变量(在栈中存储的)

先定义的高地址,后定义的低地址。

(3)类、结构体或数组的元素

先定义的低地址,后定义的高地址。
相关文章
|
BI
socket中的byte消息格式设计
这二天在研究webabcd的socket多人聊天室,想尝试增加一些功能,比如:允许用户除发送文字外,还能发送图片或文件。 问题: socket发送数据时,只能发送byte[]数组,且无法附带其它用户自定义参数,服务端如何知道用户发过来的是文字还是图片或是文件呢,所以只能在byte数组上动脑筋了. silverlight中,用户选择的图片或文件,都能变成FileStream,近而变成byte数组,初步想法是在数组前后加一些标记之类,比如最开始几个字节是"img,txt,file"中对应的一个,这样服务端接收到以后,通过拆解分析就能知道用户发过来的何种格式。
880 0
|
Java
java 读取文件 获取byte[]字节 并执行Gzip的压缩和解压
java 读取文件 获取byte[]字节 并执行Gzip的压缩和解压
125 0
|
5月前
|
Java Apache Maven
Java:commons-codec实现byte数组和16进制字符串转换
在上述代码中,`Hex.encodeHexString(bytes)`用于将byte数组转换为16进制字符串,`Hex.decodeHex(hexString)`用于将16进制字符串转换为byte数组。
111 0
|
5月前
|
Java Apache Maven
Java:commons-codec实现byte数组和16进制字符串转换
在上述代码中,`Hex.encodeHexString(bytes)`用于将byte数组转换为16进制字符串,`Hex.decodeHex(hexString)`用于将16进制字符串转换为byte数组。
133 0
|
存储 Java 计算机视觉
java 之byte
当涉及到处理数据时,Java 提供了多种数据类型,其中包括 `byte` 类型。在本文中,我们将深入探讨 Java 中的 `byte` 数据类型,了解它的特点、用途以及在编程中的实际应用。
|
Java
Java中 String与基本数据类型,包装类,char[],byte[]之间的转换
Java中 String与基本数据类型,包装类,char[],byte[]之间的转换
97 0
|
存储 Java
[java 基础知识] byte int 互转
[java 基础知识] byte int 互转
133 0
|
Dubbo 应用服务中间件
Dubbo使用Hessian2序列化时针对Byte类型出现java.lang.ClassCastException
Dubbo使用Hessian2序列化时针对Byte类型出现java.lang.ClassCastException
189 0
|
存储 Java
java基础类型中的char和byte的辨析及Unicode编码和UTF-8的区别
java基础类型中的char和byte的辨析及Unicode编码和UTF-8的区别
196 0