Java中的数据类型,不同进制之间的转换,位运算

1,计算机中的存储单位 bit和byte

  • 计算机就是一系列的电路开关,每个开关存在两种状态开和关,如果电路是开着的它的值就是1,关就是0。
  • 一个1或者0存储为一个bit(比特),它是计算机中最小的存储单位。
  • 计算机中最基本的存储单元是byte(字节),每个字节由8个比特组成。
  • 存储单位的换算:
    单位 换算
    千字节 KB 1024B
    兆字节 MB 1024KB
    千兆字节 GB 1024MB
    万亿字节 TB 1024GB

2,Java中的数据类型

  • 基本数据类型
    • 数值型
      • 整数型
        • byte 1个字节 表示范围-128–127
        • short 2个字节 表示范围 -32768–32767
        • int 4个字节 表示范围 -2的31次方 – 2的31次方 (约21亿)
        • long 8个字节 -2的63次方 – 2的63次方
          • 范围小的转为范围大的 ,精度不会丢失,范围大的转换为范围小的,,如果在数值在范围小的类型的表示范围内精度不会丢失,超过会造成精度丢失。
      • 浮点型
        • float 4个字节
        • double 8个字节
    • 字符型
      • char 2个字节
    • 布尔型
      • boolean 1个字节
  • 引用数据类型
    • 类(Class)
    • 数组(array)
    • 接口(interface)

3,Java中的位运算

1,Java中的位运算

名称 符号 运算结果
左移 << 空位补0,被移除的高位丢弃,空缺位补0。如果第一个1的高位没有移出,左移一位相当于乘以2;
右移 >> 被移位的二进制最高位是0,右移后,空缺位补0,最高位是1,空缺位补1, 右移一位相当于除以2,如果最高位是0,右移一位相当于除以2;
无符号右移 >>> 被移位二进制最高位无论是0或者是1,空缺位都用0补;
按位或 | 二进制位进行|运算,只有0|0返回0,1其他都返回1,按位或后数值变大,与0或还是本身;
按位与 & 二进制位进行&运算,只有1&1时结果是1,否则是0;按位与后数值变小,与-1与后还是本身;
异或 ^ 相同位上的位相同则返回0,不同则返回1,结果变大或者变小;
取反 ~ 正数取反,各二进制码按补码各位取反,负数取反,各二进制码按补码各位取反,取反后的值为其+1后取反,,即3按位取反后值为-4;

2,在Java中将基本数据类型转换为byte[ ] 数组(字节数组),以int类型位例;

    public static byte[] IntegerToByteArray4(Integer num){

        byte[] bytes = new byte[4];
        log.debug("需要转换为四字节数组的数字:{}, 此数字的16进制表示为:{}", num, Integer.toHexString(num));

        bytes[0] = (byte) (num >> 24);
        bytes[1] = (byte) (num >> 16);
        bytes[2] = (byte) (num >> 8);
        bytes[3] = (byte) (num | 0x00);
        return bytes;
    }


    public static byte[] getBytesX(int data) {
        byte[] bytes = new byte[4];
        bytes[0] = (byte) ((data & 0xff000000) >> 24);
        bytes[1] = (byte) ((data & 0xff0000) >> 16);
        bytes[2] = (byte) ((data & 0xff00) >> 8);
        bytes[3] = (byte) (data & 0xff);
        return bytes;
    }

在上面demo中,,将int转换为byte[]数组的运算结果相同,,getBytesX工具类转换时先将int数据和0xff000000进行与运算,最高的8位和0xff进行与运算后最高位其实没有变化,,然后在右移24位,,将最高的8位封装到byte[0]中,而IntegerToByteArray4工具类中没有进行位运算,直接进行位移,两个结果相同。

图解(因为图放不下32个格,画了20个代替,只看前8位,后面的道理相同)

0 1 1 1 0 0 0 1 1 0 0 1 0 0 1 0 0 1 1 1
1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0

右移24位后的后前8位变成后8位,将后八位放的byte[0]的位置;
result

你可能感兴趣的:(JAVA,java)