• & 0xff 的作用


    在使用md5加密的时候,hash数组转字符串的方法里面,有一段的代码上面写了 0xff,一开始优点不太懂,后面上网补了一下基础,记录下了;

    代码示例:

     public static String byteToHexString(byte[] b) {
            StringBuffer hexString = new StringBuffer();
            for (int i = 0; i < b.length; i++) {
                String hex = Integer.toHexString(b[i] & 0xFF); //就是这一段代码
                if (hex.length() == 1) {
                    hex = '0' + hex;
                }
                hexString.append(hex.toUpperCase());
            }
            return hexString.toString();
        }
    

    故事,要从计算机的基础开始:

      原码:原码(true form)是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。

      反码:数值的正负相关;

        正数的反码还是等于原码,例如:十进制数100D,它的二进制数是0B1100100(0B 0000 0000 0000 0000 0000 0000 0110 0100,整数类型4字节共32位,需要在前面补0);

        负数的反码就是他的原码除符号位外,按位取反。例如:十进制数-100D,它的二进制数是0B 1000 0000 0000 0000 0000 0000 0110 0100;那么反码是:0B 1111 1111 1111 1111 1111 1111 1001 1011

      补码:正数的补码与其原码相同;负数的补码是在其反码的末位加1。

        例如负数-1,原码是1,补码是0b1111 1111

    下面是用代码来去对应的进制值:

     1 public class Test {
     2     public static void main(String[] args) {
     3         int num  = 100;
     4         int num2= -100;
     5         System.out.println(Integer.toBinaryString(num));
     6         //1100100   正数,输出为原码
     7         System.out.println(Integer.toBinaryString(num2));
     8         //11111111111111111111111110011100  负数,输出为反码
     9     }
    10 }

      

    说完这些:

      通过加密算法或者其他方法获取到的byte数组,其中的数值的取值范围是[-128 , 127 ] (Byte.MIN_VALUE=-128 ,Byte.MAX_VALUE=127),所以有可能为正数或者负数;执行Integer.toBinaryString(num)这段代码的时候,会先进行类型提升的操作,就是byte提升到int(坑爹,原来这个方法是int,执行需要把两个值转成int);何为补位?就是btye占用一个字节共八位,int占用4个字节共32位,进行&操作,需要转成二进制数,正数直接在前面补24个0,负数需要在二进制数上面补24个1;byte类型数值执行 & 0xff 操作的时候,正数不会改变本身的值,0xff是16进制数,这个刚好8位都是1的二进制数,而且转成int类型的时候,高位会补0;在&正数byte值的话,对数值不会有改变,toBinaryString保持2位十六进制数,在&负数数byte值的话,对数值前面补位的1会变成0,toBinaryString保持2位十六进制数,也不会有前面的ffffff

      希望以后自己回来看能看懂吧

  • 相关阅读:
    [置顶] RGB颜色查询对照表
    3.3FactoryMethod——工厂方法
    从零开始学C++之数据封装与抽象:分别用C和C++来实现一个链栈
    C# 自定义事件
    Qt4--加密日记本(子例化QMainWindow文本加密解密)
    SharePoint PerformancePoint Service-PowerShell
    Windows下安装Eric5时出现的“Sorry, please install QtHelp.”问题解决办法
    Char* ,CString ,WCHAR*之间的转换
    [C++基础]关键词volatile
    备忘--简单比较SPSS、RapidMiner、KNIME以及Kettle四款数据分析工具
  • 原文地址:https://www.cnblogs.com/zhongxiaoze/p/13757117.html
Copyright © 2020-2023  润新知