精华内容
下载资源
问答
  • 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 &运算 辨识度分析,反向推论出取余是最好的散列手段,避免造成数据堆积

    展开全文
  • 文档介绍:趣味数学计算机中数据的存储二进制.ppt计算机中的数学计算机中数据的表示众所周知,所有的数据在计算机内部都是以二进制表示的。我们今天的任务,就是研究二进制、十进制、八进制及十六进制之间的关系。...

    文档介绍:

    趣味数学计算机中数据的存储二进制.ppt计算机中的数学

    计算机中数据的表示

    众所周知,所有的数据在计算机内部都是以二进制表示的。

    我们今天的任务,就是研究二进制、十进制、八进制及十六进制之间的关系。

    二进制数字世界

    人们在日常生活中最熟悉的是十进制,计算机在进行数据处理时,数据在计算机内部是以二进制代码形式流通与处理的,处理结束后处理结果仍以人们熟悉的形式输出。

    二进制由0和1两个数码组成,每位记满2,就向高位进1,即逢2进1。

    二进制用英文字母B或下标“2”来表示

    常用数制比较

    进制

    组成

    表示方法

    示例

    二进制

    0、1

    下标2或B

    (1010)2

    十进制

    0—9

    下标10或D

    (156)10

    八进制

    0—7

    下标8或O

    (156)8

    十六进制

    0—9

    A—F

    下标16或Ox

    (8A)16

    数制转换 1.R进制与十进制的转换

    方法:“按权展开求和”

    例:  (1011.01)2 =(1×23+0×22+1×21+1×20+0×2-1+1×2-2 )10

    =(8+0+2+1+0+0.25)10

    =(11.25)10

    (3506.2)8

    =(3×83+5×82+0×81+6×80+2×8-1)10

    =(1862.25)10

    总结

    当从R进制转换到十进制时,可以把小数点作为起点,分别向左、右两边进行。

    基数为R的数字,只要将各位数字与它的权相乘,其积相加,和数就是十进制数。

    2.十进制转换成R进制

    十进制转二进制

    十进制整数转二进制数:“除以2取余,逆序输出”

    十进制小数转二进制数:“乘以2取整,顺序输出”

    练****十进制转化为二进制:

    (30)10=( )2 (0.234)10=( )2

    3 64 78 156 256

    二进制转化为十进制:

    110001101

    100000

    1111101

    总结

    将十进制数转换成基数为R的等效表示时,可将此数分成整数与小数两部分分别转换,然后再拼接起来即可。

    十进制整数转换成R进制的整数,可用十进制数连续除以R,其余数即为R进制的各位系数。此方法为除R取整法。

    内容来自淘豆网www.taodocs.com转载请标明出处.

    展开全文
  • 运用移位将十进制转换成二进制数,八进制,十六进制 提要:通过移位,求出对应位的的值,char保存 实现代码: public class Test { public static void main(String[] args) { toBinary(60); //...

    运用移位将十进制数转换成二进制数,八进制数,十六进制数

    提要:通过移位,求出对应位的数的值,用char保存
    实现代码:

    public class Test {
    
        public static void main(String[] args) {    
            toBinary(60);   //求二进制
            toOctal(60);//求八进制
            toHex(60);//求十六进制
        }
        public static void toBinary(int num){//求二进制
            char[] arr=trans(num,1,2);
            System.out.print("对应二进制为:");
            for(int i=0;i<arr.length;i++){
                System.out.print(arr[i]);
            }
            System.out.println();
        }
        public static void toOctal(int num){//求八进制
            char[] arr=trans(num,7,3);
            System.out.print("对应八进制为:");
            for(int i=0;i<arr.length;i++){
                System.out.print(arr[i]);
            }
            System.out.println();
        }
        public static void toHex(int num){//求八进制
            char[] arr=trans(num,15,4);
            System.out.print("对应十六进制为:");
            for(int i=0;i<arr.length;i++){
                System.out.print(arr[i]);
            }
        }
        public static char[] trans(int num,int m,int n){
            char[ ] chs={'0','1','2','3',//数组容器,固定值恰好对应有下标
                              '4','5','6','7',
                              '8','9','A','B',
                              'C','D','E','F',
                               };
            char[] arr1 = new char[8];
            int pos=arr1.length;
            while(num!=0){
                int temp=num&m;
                arr1[--pos]=chs[temp];
                num = num >>>n;
            }
            int k=arr1.length-pos;
            char[] arr2 = new char[k];
            for(int i=0;i<k;i++){
                arr2[i]=arr1[pos];
                pos++;
            }
            return arr2;
        }   
    }
    

    输出结果:
    对应二进制为:110
    对应八进制为:74
    对应十六进制为:3C

    展开全文
  • void fun(intx,intb[]) { int k=0,r; do { r=x%2; b[k++]=r; x/=2;}while(x); }
    void fun(intx,intb[])
    {
    int k=0,r;
    do
    {
    r=x%2;
    b[k++]=r;
    x/=2;}while(x);
    }
    
    展开全文
  • 问题描述:在控制台连续输入多个八进制(中间空格隔开),把这些八进制转为二进制数。 源代码如下: # include<iostream> using namespace std; //说明:234的个位数是4,十位是3,百位是2。(下面...
  • 《趣味数学计算机中数据的存储二进制》由会员分享,可在线阅读,更多相关《趣味数学计算机中数据的存储二进制(29页珍藏版)》请在人人文库网上搜索。1、计算机中的数学,计算机中数据的表示,众所周知,所有的数据在...
  • 二进制数据是0和1两个数码来表示的。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”。二进制数据也是采用位置计数法,其位权是以2为底的幂。例如二进制数据110.11,其权的大小顺序为2^2、2^1、2^...
  • 试题 算法训练 二进制数数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述  给定L,R。统计[L,R]区间内的所有二进制下包含的“1”的个数之和。  如5的二进制为101,包含2个“1”。 输入格式  第一行包含...
  • 题意:求一个区间内所有二进制数的1有多少位数 思路:先将其转化为二进制,因为只需要1的个数,所以可以先将其排序之后,通过下标的方式输出其1的位数。还有一个要注意的是1的位数可能超过int,使用long long ...
  • 例如,5的二进制形式为101b,有3个二进制位,17的二进制形式为1 0001b,有5个二进制位。问题:已知n∈[0, pow(2, 31) ),求n的二进制位数。 拿到问题后,我在纸上列举了一些例子,以观察规律。例子如下: ...
  • 最近在Python写遗传算法时,发现需要将十进制的整数转换成二进制数,那么怎么来转换呢?当然如果你学过进制转换的有关计算方法,你可以手动编写一些函数来实现,不过总体来说还是比较麻烦的,这里介绍Python内置的...
  • 进制转换的原理: 先将一个十进制转换成二进制数; (构造一个0 ~2^30的数组,number和数组中每...例如八进制:3位可以表示一个,从数组的0下标开始,依次往后取三位计算出值存入一个临时数组中,所有的二进制
  • 求一个二进制数中1的个数,规定这个只有8位 package the_beauty_of_programming; public class Count_1_of_binary { public static void main(String[] args) { int n=9; int m=Count0(n); System.out....
  • 遍历二进制数表示的集合的子集问题描述用二进制数表示集合暴力循环程序位运算寻找子集程序 问题描述 在一些算法问题中,我们常常计算机中的二进制数来表示一个集合。在程序设计问题中常被称作是状态压缩。 举个...
  • 一:目的将十进制整数转化为二进制与十六进制输出。二:技术。1.利用for循环和数组知识将十进制转化为二进制输出。图片发自简书App2.利用for循环和数组知识将十进制转化为十六进制输出。图片发自简书App3.数组的定义,...
  • 第二个就是其本身与上其二进制数减一, 例如:x&(x-1) 当x=5时, 5的二进制是0101 0101 & (0101-1) == 0101 & 0100 == 0100 0100 & (0100-1) == 0100 & 0011 == 0000 一共计算了两次,也就是说
  • 获取二进制数中某一位的值

    万次阅读 2018-05-30 11:09:24
    获取数字 num 二进制形式第 bit 位的值。注意: 1、bit 从 1 开始 2、返回 0 或 1 3、举例:2 的二进制为 10,第 1 位为 0,第 2 位为 1 示例1 输入 复制 128, 8 输出 复制 1 我的解答: function ...
  • 最近在Python写遗传算法时,发现需要将十进制的整数转换成二进制数,那么怎么来转换呢?当然如果你学过进制转换的有关计算方法,你可以手动编写一些函数来实现,不过总体来说还是比较麻烦的,这里介绍Python内置的...
  • 算法-求一个二进制数的长度

    千次阅读 2017-10-19 10:46:00
    任意给定一个32位无符号...所以一个二进制数的长度也即最高位1的下标值+1(下标从0开始)。题目很简单,下面提供三种方法 普通方法 递归法 二分搜索+查表 普通法 移位+计数,每移位一次,计数器加1,直到n为0 ...
  • 今天做一道输出第一次出现的题目时,使用一个数组存储之前出现过的,然后搜索数组判断是否出现过。...然后想到了用二进制数作为标记的方法,进一步节省空间。但是只能用于数据范围很小的 比如0-30 ...
  • 给定一个正整数,检查它的二进制表示是否总是 0、1 交替出现:换句话说,就是二进制表示中相邻两位的数字永不相同。 示例 1: 输入:n = 5 输出:true 解释:5 的二进制表示是:101 示例 2: 输入:n = 7 输出:...
  • 统计[L,R]区间内的所有二进制下包含的“1”的个数之和。  如5的二进制为101,包含2个“1”。 输入格式  第一行包含2个L,R 输出格式  一个S,表示[L,R]区间内的所有二进制下包含的“1”的个数之和。 ...
  • 二进制数 位的操作

    千次阅读 2019-05-23 17:52:16
    题目:获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列 这里,我运用最笨或者说最直接的做法,两个数组分别存储奇位和偶数位,然后循环,若当前为第奇数次循环,将该最低位存入奇数数组,同理...
  • 给定两个二进制字符串,返回他们的和(用二进制表示)。 输入为非空字符串且只包含数字 1 和 0。 示例 1: 输入: a = &quot;11&quot;, b = &quot;1&quot; 输出: &quot;100&quot; ...
  • 在计算机系统中,通常将十进制作为人机交互的媒介,而数据则以二进制数的形式存储和运算。 计算机采用二进制的主要原因有以下几点: (1)易于物理实现 二进制在技术上最容易实现。这是因为具有两种稳定状态的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 91,897
精华内容 36,758
关键字:

二进制数用下标