精华内容
下载资源
问答
  • 数组下标用十六进制表示
    2022-01-13 11:15:11

    今天看公司大神写的java代码,数组下标用十六进制表示。当然代码得修改才能用。其中用法的优缺点以及适用的场景。

    第一部分
    class Inter{
        static final char[] DIGITS = {
                '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
                'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
                'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
                'u', 'v', 'w', 'x', 'y', 'z'
        };
    
        static final char[] UPPER_CASE_DIGITS = {
                '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
                'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
                'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
                'U', 'V', 'W', 'X', 'Y', 'Z'
        };
    
        public static void printUppercaseByteArraWithHexIndex(byte[] bytes){
            char[] digits = UPPER_CASE_DIGITS;
            for (byte b : bytes){
                System.out.println(digits[(b >> 4) & 0xf]);
                System.out.println(digits[b & 0xf]);
            }
        }
    
        public static String bytesToHexString(byte [] bytes, boolean upperCase) {
            char[] digits = upperCase ? UPPER_CASE_DIGITS : DIGITS;
            char[] buf = new char[bytes.length * 2];
            int c = 0;
            for (byte b : bytes) {
                buf[c++] = digits[(b >> 4) & 0xf];
                buf[c++] = digits[b & 0xf];
            }
            return new String(buf);
        }
    }
    
    第二部分(主函数)
        public static void main(String args[]){
            byte[] bytesa = {(byte) 0x5A, (byte) 0xa6, (byte) 0x1a, (byte) 0x3a, (byte) 0xaa};
            String s =  Inter.bytesToHexString(bytesa,true );
            System.out.println(s);
            Inter.printUppercaseByteArraWithHexIndex(bytesa);
        }
            
    
    更多相关内容
  • HashMap-二进制&计算下标方法刨析

    千次阅读 2019-09-15 11:36:01
    1、HashMap计算下标的方法 计算下标源码 Node<K,V>[] tab; Node<K,V> p; int n, i; if ((tab = table) == null || (n = tab.length) == 0) n = (tab = resize()).length; if ((p = tab[i = (n - ...

    1、HashMap计算下标的方法

    计算下标源码

    Node<K,V>[] tab; Node<K,V> p; int n, i; 
    if ((tab = table) == null || (n = tab.length) == 0)
       n = (tab = resize()).length;
    if ((p = tab[i = (n - 1) & hash]) == null) 
       tab[i] = newNode(hash, key, value, null);

    源码中n为数组长度,i为插入位置下标
    第四行 tab[i = (n - 1) & hash] 得知 下标 = 数组长度-1 位与 hash

    2、为什么做 & 操作

    2.1、假如用十进制思想实现

    我们思考数学计算的方式通常以十进制思想,我们先按通常人思路讲解,随后再引出为什么HashMap用 & 计算。
    假如HashMap创建长度为16的数组(默认创建方式长度确实为16,稍后详细介绍),hash值为32位以内任意数
    在这里插入图片描述
    32位int范围为-2147483648 - 2147483647,将如此庞大的数据范围散列的存放在长度为16的数组中,我们想到的是取余。

    14%16 = 14 14存放在14下标位
    18%16 = 2 18存放在2下标位
    32%16 = 0 32存放在0下标位
    当然在HashMap中还存在碰撞解决,再此不做讨论
    在这里插入图片描述
    十进制的思想告诉我们,想要将hash值均匀的分布在固定大小的数组中,要用到取余计算下标

    2.2、更加效率的&运算

    我们知道计算机底层是二进制运算,直接用二进制&计算去模拟取余操作,能够增加计算效率

    2.3、取余 与 位与(&) 运算之间的关联

    上面我们提到 下标 = 数组长度-1 位与 hash值
    而创建HashMap的数组长度为2n,假设数组长度=16hash=100

    16-1 的二进制 1111
    100 的二进制 1100100
    两者做&运算
    0001111
    &
    1100100
    我们可以发现由于0001111高位为0
    事实上就是
    1111
    &
    0100
    取余结果为100(二进制)= 4,由于100%16=4,结果与取余结果相同

    我们可以看到利用&运算时,hash值高位数据不参与运算,低位数据便是取余结果
    为什么会这样呢???
    首先回顾一下将二进制转换十进制
    11111111 转换为十进制 128+64+32+16+8+4+2+1 = 255,二进制的1从高位到低位分别代表 128、64、32、16、8、4、2、1
    每一位代表的数 = 前面所有位代表数的合 + 1;

    2 = 1+1
    4 = 2+1+1
    8 = 4+2+1+1
    16 = 8+4+2+1+1
    、、、

    我们再回过头看HashMap中计算下标的算法,i = (n-1) & hash,在n值为2的k次幂条件下。hash值高于n-1的位无论是1或0都是n的倍数,而低于n-1的位本身便是余数
    假如n(数组长度)不为2的k次幂,以上结论不成立

    2.4、假如不为2的k次幂

    刚刚一直强调数组长度为2的k次幂,假如不符合这特定条件会怎样
    计算(2的k次幂-1)的二进制

    2-1 = 1
    4-1 = 11
    8-1 = 111
    16-1 = 1111
    32-1 = 11111

    可以看出符合特定条件的n-1所有位都为1
    前面也介绍了技术下标算法是hash的低位与n-1做&运算
    假设hash = 0101或hash = 0100,计算两种情况的结果

    例一
    1111
    &
    0101
    等于 0101

    例二
    1111
    &
    0100
    等于 0100

    例三
    1100
    &
    0101
    等于 0100

    例四
    1100
    &
    0100
    等于 0100

    可以看出例三例四hash值不同但结果相同,n-1二进制全是1的情况下做&运算更有辨识度,更能有效将数据散列开

    3、总结

    1、用二进制&运算完全可以替代取余运算并且这么做是为了提高计算机运算效率
    2、只有限定数组长度2的k次幂才能用&运算模拟取余运算
    3、通过对n-1 &运算 辨识度分析,反向推论出取余是最好的散列手段,避免造成数据堆积

    展开全文
  • (1)下标法:1102,1108,11010,11016 (2)后缀字母法(BODH):110B,110O,110D/110,110H 基数 二进制:0、1 八进制:0 ~ 7 十进制:0 ~ 9 十六进制:0 ~ 9 ,a,b,c,d,e,f (a ~ f:10,11,12,13,...

    (1)下标法:1102,1108,11010(100),11016
    (2)后缀字母法(BODH):110B,110O,110D(110),110H

    • 基数
      二进制:0、1
      八进制:0 ~ 7
      十进制:0 ~ 9
      十六进制:0 ~ 9 ,a,b,c,d,e,f
      (a ~ f:10,11,12,13,14,15)

    • 进制转换

    • 二进制与十进制
      十转二(八、十六),短除2(8、16)。

    十转二D → B
    12 → 1100在这里插入图片描述
    二转十B → D
    1100 → 12在这里插入图片描述
    二(八、十六)转十,按权重展开,2(8、16)的n次方相加。1 * 23 + 1 * 22 + 0 * 21 + 0 * 20 = 12
    • 二进制与八进制
    八进制01234567
    二进制000001010011100101110111
    八转二O → B
    除2取余每个数字转为3个二进制,不足往左补零
    246 → 10100110在这里插入图片描述
    按照对应的数字,快速推出在这里插入图片描述
    二转八B → O
    从右到左,不足补零取三合一,展开求和
    10100110 → 246在这里插入图片描述
    按照对应的数字,快速推出在这里插入图片描述
    • 二进制与十六进制
    十六进制01234567
    二进制00000001001000110100010101100111
    89ABCDEF
    10001001101010111100110111101111
    十六转二H → B
    除2取余每个数字转为4个二进制,不足往左补零
    35F → 1101011111在这里插入图片描述
    按照对应的数字,快速推出在这里插入图片描述
    二转十六B → H
    从右到左,不足补零取四合一,展开求和
    1101011111 → 35F在这里插入图片描述
    按照对应的数字,快速推出在这里插入图片描述
    • 八进制与十六进制
    八转十六先八转二,再二转十六
    十六转八先十六转二,再二转八
    展开全文
  • 主要介绍了C++中二进制求补运算符与下标运算符的用法,是C++入门学习中的基础知识,需要的朋友可以参考下
  • 不同进制之间的转换

    千次阅读 2018-11-26 09:55:02
    在这里暂且只讨论整型正数,二、八、十、十六进制之间的相互转换,以后可能会对非整型负数和其他进制进行补充。  首先,我研究了进制之间相互转换的方法,如下:    从转换关系中,我们推出发现一个结论:任何...

     在这里暂且只讨论整型正数,二、八、十、十六进制之间的相互转换,以后可能会对非整型负数和其他进制进行补充。

           首先,我研究了进制之间相互转换的方法,如下:

         

           从转换关系中,我们推出发现一个结论:任何进制数在转换成十进制数时,均为按权展开相加求和;十进制数在转换成任何进制数时,均为除其进制取余(这两个结论应该不止仅限于二、四、八、十六进制的相互转换)。那么,我们可以选取十进制作为中间进制,即在进行进制转换时,先把初始进制数转换为十进制数,再转换成目标进制数。

           接下来,我们来详细研究一下这个过程。既然以十进制为中间进制,那么我们就需要分为两种情况进行讨论,初始值的进制是十进制 的和不是十进制的。

           首先我们讨论的是初始值不是十进制的情况,因为它相对复杂一些。我们在得到初始值后,需要将其按权展开相加求和,在这之前,我们先来了解一下什么是按权展开相加求和,简单来说就是将其各个位上的数乘以其进制的n(n是这个位上数是这个数的第n位)次方,这样可能比较难以理解,我们来举个例子。

            

          从这个过程中,我们可以想到,这个过程可以用一个for循环输出a[i]*(b^i)做加法(其中a[i]为存放着各个位上值的数组,b为初始值的进制)。我们首先就需要把初始值的各个位上的值放入数组a[i]中,这是我们需要定义的第一个方法,将其命名为Fenjie,作用是把初始值数组化。把初始值数组化之后,我们就要将其先转换为十进制数了,再进行进制转换,这是需要定义的第二个方法,我们将其命名为Zhuanhuan1,作用是把数组化的初始值转换为十进制数。接下来就是把转换好的十进制数转为目标进制数了,再定义我们的第三个方法,将其命名为Zhuanhuan2,作用是把转换后的十进制数再转换为目标进制数。在这里,我们需要思考一个问题,十进制数在转换为目标进制数时,使用的是除其进制而后取余,余数从上往下,但我们需要的是从下往上,就像这样

                 
    因此,我们需要定义第四个方法Jiaohuan或者用for循环输出时,用减循环将数组倒着输出来。

    最后再来理一下这个进制转换的过程:初始值如果非十进制,则先调用Fenjie方法进行数组化,数组化后的初始值调用Zhuanhuan1方法转为十进制,十进制数再调用Zhuanhuan2方法转换为目标进制数。至于初始值是十进制的,直接调用Zhuanhuan1方法进行转换就ok了。

     

    高效进制转换的三种方法

    1、 使用数组存储数据

    #include<iostream>
    using namespace std;
    char* Convert_16(unsigned long value)
    {
        static char Buffer[sizeof(unsigned long)*2+1];//9位 空间大小,静态空间自动赋0
        int mod;
        for(int i=sizeof(unsigned long)*2-1; i>=0; --i)//取模反向存储
        {
            mod = value % 16;
            if(mod < 10)
            {
                Buffer[i] = mod + '0';
            }
            else
            {
                Buffer[i] = (mod-10) + 'A';
            }
            value /= 16;
        }
        return Buffer;
    }
    void main()
    {
        unsigned long value = 4711;
        char *result = Convert_16(value);
        cout<<value<<" = "<<"0x"<<result<<endl;
    }
    

     2.使用栈存储数据 先入后出

    #include<iostream>
    #include<stack>
    using namespace std;
    void Convert_16(unsigned long value)
    {
        stack<char> st;.//定义栈st 
        int  mod;
        while(value != 0)
        {
            mod = value % 16;
            if(mod < 10)
            {
                st.push(mod+'0');//入栈push
            }
            else
            {
                st.push((mod-10) + 'A');
            }
            value /= 16;
        }
        cout<<value<<" = "<<"0x";
        while(!st.empty())  ///不为空 则出栈 出栈 pop
        {
            cout<<st.top();
            st.pop();
        }
        cout<<endl;
    }
    void main()
    {
        unsigned long value = 4711;
        Convert_16(value);
    }
    

    3、使用字符串常量高效转换 推荐*

    #include<iostream>
    #include<stack>
    using namespace std;
    char* Convert_16(unsigned long value)
    {
        static char Buffer[sizeof(unsigned long)*2+1];
        for(int i=sizeof(unsigned long)*2-1; i>=0; --i)
        {
            Buffer[i] = "0123456789ABCDEF"[value%16];/字符串常量,模直接对应数组的值去存入,把模的结果当做下标,余数为3则存入3;
            value /= 16;
        }
        return Buffer;
    }
    void main()
    {
        unsigned long value = 4711;
        char *result = Convert_16(value);
        cout<<value<<" = "<<"0x"<<result<<endl;
    }
    


    --------------------- 
    资料:

    1.https://blog.csdn.net/qq_37965228/article/details/79648515

    2.https://blog.csdn.net/zxh1592000/article/details/78905647

    2.C语言实现任意进制数之间的转换https://blog.csdn.net/qq_36454961/article/details/79174645

    展开全文
  • 计算机中不同进制数的表示

    千次阅读 2021-07-25 02:22:43
    计算机中不同进制数的表示在电子计算机的信息处理中,无论多么复杂的信息,例如,图片、音乐、视频等,在计算机内部都是仅用“0”与“1”两个简单数字表示的信息,对于在实际当中我们能理解的信息都是用这种数字进行...
  • 基数与权值 二进制进制进制 十六进制 常用数制转化–非十进制转换成十进制 ...下标D表示十进制下标H表示十六进制下标O表示八进制,B表示二进制。 常用数制转化–十进制转化为其他进制 ...
  • 本文实例讲述了PHP实现的62进制转10进制,10进制转62进制函数。分享给大家供大家参考,具体如下: 百度出来的无法使用,只好自己写,有bug的地方欢迎留言,感谢 function from62to10($str){ $dict = '0123456789...
  • 众所周知,计算机中使用的是二进制运算规则,能够读懂二进制语言,但究竟什么是进制进制之间是如何相互转化的?今天我们就来详细了解下。
  • 各种进制的一般书写方式.2021-03-13

    千次阅读 2021-03-13 16:13:35
    注意 操作系统或者编程语言显示的各种进制格式 往往不同于一般的进制书写方式 1.二进制进制数的书写通常在数的右下方注上基数2,或在后面加B表示,其中B是英文二进制Binary的首字母。 例如:二进制数...
  • 关于不同进制的标志

    千次阅读 2012-11-29 10:32:18
    非十进制数:八进制以"0"开头,十六进制以"0x"开头,二进制以"0b"开头。前置"0"只对数字有效。
  • 文章目录10进制整数实数2进制实数8进制实数16进制实数 10进制 以10为底数来表示一个数,数码集S={0,1,2,3,4,5,6,7,8,9}。 整数 一个十进制数表示为: ±Sk−1...S2S1S0\footnotesize ±S_{k-1}...S_{2}S_{1}S_{0} ±...
  • 十六进制(简写为hex或下标16)在数学中是一种逢16进1的进位制。一般用数字0到9和字母A到F(或a~f)表示,其中:A~F表示10~15,这些称作十六进制数字。 开发中经常需要把16进制字符串转换成整形,写了个个代码供大家...
  • 进制之间的转换

    千次阅读 2019-08-24 16:58:54
    目录 一常见数制类型及表示方法:... 2 1.1十进制(Decimal):......二不同进制的对应关系:... 3 2.1 非十进制数转换为十进制数... 4 1.二进制转换位十进制... 5 2.八进制转换为十进制:... 5 ...
  • bcd码和二进制码有什么区别

    千次阅读 2021-07-26 01:06:10
    描述二进制是由1和0两个数字组成的,它可以表示两种状态,即开和关。所有输入电脑的任何信息最终都要转化为二进制。目前通用的是ASCII码。最基本的单位为bit。二进制编码是用预先规定的方法将文字、数字或其他对象编...
  • 进制(标识B)十进制.ppt计算机中数据的表示 十进制 - Decimal 由十个符号组成 逢十进一 ...十六进制 – Hex 由十六个符号组成:0-9 A-F 逢十六进一 简化书写,和二进制转化方便 不同数制的常见书写方法 下标法: (1...
  • 进制转换二进制

    2019-02-28 22:27:42
    进制转换二进制 顺序压入,倒序输出(数组下标 --) int b[MAX]; int s = 0; while (c != 0) { b[s] = c % 2; c /= 2; s ++; } while (--s &gt;= 0) printf("%d", b[s]); printf("\n&...
  • 进制指以2为基数的记数系统,这一系统中,通常用两个不同的符号0(代表零)和1(代表一)来表示 。现代的计算机和依赖计算机的设备里都用到二进制。每个数字称为一个比特(Bit,Binary digit的缩写) 。 八进制 ...
  • 十六进制

    千次阅读 多人点赞 2020-10-09 16:36:57
    十六进制(简写为hex或下标16)在数学中是一种逢16进1的进位制。一般用数字0到9和字母A到F(或af)表示,其中:AF表示10~15,这些称作十六进制数字。 表示方式: C语言、C++、Shell、Python、Java语言及其他相近的...
  • 0x是16进制的前缀,H是16进制的后缀 都是表示十六进制数,意义上没有什么区别,完全相等。至于什么时候用0x,什么时候用H,这取决于你在什么环境下使用,如果在C/C++,必须用0x来表示。 在C语言中是不能用H的. 在...
  • 从小我们就开始学数学,数学就有涉及到进制知识,相信大家对于进制都不陌生吧!进制也就是进位制,是一种进位方法。现在大家都有电脑,利用电脑自带的计算机进行进制转换是最简便的方法,下面是小编给大家总结的...
  • 进制如何转换为十进制?

    千次阅读 2021-06-19 05:54:00
    进制到十进制数字转换使用加权列来标识数字的顺序以确定数字的最终值将二进制转换为十进制(base-2到base-10) )数字和背面是一个重要的概念,因为二进制编号系统构成了所有计算机和数字系统的基础。十进制或...
  • 进制

    2021-07-15 04:50:39
    进制也就是进位计数制,是人为定义的带进位的计数方法(有不带进位的计数方法,比如原始的结绳计数法,唱票时常用的“正”字计数法,以及类似的tally mark计数)。 对于任何一种进制---X进制,就表示每一位置上的数...
  • C语言学习—进制之间相互转换

    千次阅读 2021-12-12 15:31:05
    进制之间的相互转换
  • 现有一个二进制数,如何快速判断某位是0还是1? 比如:111,我要判断从右到左第3位是0 或 1,怎么快速判断? N:待判断的二进制数的十进制数 B:待判断的位(右往左) 结果:(N>>(B-1))&1 ...
  • 不同的数制,可以给数字加上括号,使用下标来表示该数字的数制(当没有下标时默认为十进制)如:(1010)2、123、(2A4E)16,分别代表不同数制的数。 除了用下标表示外,还可以用后缀字母来表示数制,两者的意义相同。
  • 进制转换-题解

    2020-04-10 21:25:54
    进制转换-题解 2020.04.10 2020.04.16修改 读题: 原题链接 请你编一程序实现两种不同进制之间的数据转换。 输入格式:共三行,第一行是一个正整数,表示需要转换的数的进制n(2≤n≤16),第二行是一个n进制数,若n>...
  • 十六进制(简写为hex或下标16)在数学中是一种逢16进1的进位制。一般用数字0到9和字母A到F(或a~f)表示,其中:A~F表示10~15,这些称作十六进制数字。0x为十六进制的表示符号(也可用字母H后缀表示),一个数如果要...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 115,339
精华内容 46,135
关键字:

不同进制的下标

友情链接: cfenng-01113u.rar