Byte和bit

458 阅读2分钟

bit:二进制的表示方式或者单位,只有0和1

Byte:8bit表示1Byte,也是单字节,分正负数,以整数的形式显示,例如(Byte)0X0F,如果使用log输出,你会发现输出的是15。

这时候你会发现一个问题(byte)0X90,这个使用log输出的时候,会发现神奇的现象,输出的是-112,为什么呢,怎么成负数了,不要着急,咱们慢慢来讲。

前面说了一个Byte是8bit,并且分为正负,最高位是正负的符号,1代表负数,0代表整数,0X90 二进制位 1001 0000,大家看到了吗,首位是1,是负数,又出现问题了,就算是负数,也应该是-16也不应该是-112啊,这又涉及到计算机的编码方式了,计算机使用的是补码形式,具体的实现方式感兴趣的同学可以自己去查查。咱们继续,还得有一些信息需要补充一下

单字节:8位 1111 1111

Byte:8位,单字节 (有符号)

char:双字节

双字节:16位 short

四字节:32位 int

long:8字节

float:4字节

double:8字节

Byte是单字节,int是四字节的,这就在转换补码的时候出现问题了,位数是不一致的,这个怎么办呢,总不能按照错的计算吧,当然有办法 byte.toInt() and 0XFF,大家想想为什么要和0XFF与呢?

悄悄告诉你,主要是补位,8位变为32位,钱24位补0,这就成正数了,变为正常的数值了。

说多了,说说今天想实现的功能吧,Byte和bit的想换转换和如何输出Byte形式的字符串

Byte转bit

/** *Byte转Bit */

fun byteToBit(byte: Byte): String {
    return "${(byte.toInt() and 0XFF shr 7 and 0X01).toByte()}" +
            "${(byte.toInt() and 0XFF shr 6 and 0X01).toByte()}" +
            "${(byte.toInt() and 0XFF shr 5 and 0X01).toByte()}" +
            "${(byte.toInt() and 0XFF shr 4 and 0X01).toByte()}" +
            "${(byte.toInt() and 0XFF shr 3 and 0X01).toByte()}" +
            "${(byte.toInt() and 0XFF shr 2 and 0X01).toByte()}" +
            "${(byte.toInt() and 0XFF shr 1 and 0X01).toByte()}" +
            "${(byte.toInt() and 0XFF shr 0 and 0X01).toByte()}"
}

只能这样一个一个的去处理,然后组成bit字符串

bit转Byte

/** * Bit转Byte */

fun bitToByte(bit: String): Byte {
    var len = 0

    if (bit == null) {
        return 0
    }

    len = bit.length

    when (len) {
        4 -> {
            return Integer.parseInt(bit, 2).toByte()
        }
        8 -> {

            if (bit.toCharArray()[0] == '0') {
                //正数
                return Integer.parseInt(bit, 2).toByte()
            } else {
                //负数
                return (Integer.parseInt(bit, 2) - 256).toByte()
            }
        }
        else -> return 0
    }
}

Byte转字符串

/**
 * Byte转字符串
 */
val HEXES = "0123456789ABCDEF"
val HEX_INDICATOR = "0X"
fun byteToString(byte: Byte): String {
    var hex = StringBuilder(2)
    hex.append(HEX_INDICATOR)
    hex.append(HEXES.toCharArray()[byte.toInt() and 0XFF and 0XF0 shr 4] )
    hex.append(HEXES.toCharArray()[byte.toInt() and 0XFF and 0X0F] )
    return hex.toString()
}