import java.util.*;

public class Bs {

    //Integer.highestOneBit((number - 1) << 1)分解

    public static void main(String []args) {

       //number(hashMap需要多大的长度,先简单的理解为table.length)
int a = 1;//根据传入的table.length=1,计算这个hashMap需要多大的长度
int b = 3;
int c = 5;
int d = 8;
System.out.println("初始结果----------------------------------");
System.out.println(Integer.toBinaryString(a));//
System.out.println(Integer.toBinaryString(b));//
System.out.println(Integer.toBinaryString(c));//
System.out.println(Integer.toBinaryString(d));//
System.out.println(""); //number - 1 ****************************************************为什么减1?--->保证结果是最近偶数
int a1 = 1-1;//
int b1 = 3-1;//
int c1 = 5-1;//
int d1 = 8-1;//7 //number
//int a1 = 1; //不减1最终的结果是1-->2;应该是1
//int b1 = 3; //不减1最终的结果是3-->4;应该是4
//int c1 = 5; //不减1最终的结果是5-->8;应该是8
//int d1 = 8; //不减1最终的结果是8-->16;应该是8 //为什么减1
//如果这个数为奇数,减1后是比它小1的偶数,这个偶数是2的倍数,如果乘2,可能恰好是一个2的次方
//如果这个数为偶数,可能本身它就是一个2的次方,那么通过下面的移位算法,计算出来的空间就会大,浪费空间 System.out.println("减1结果----------------------------------");
System.out.println(Integer.toBinaryString(a1));//
System.out.println(Integer.toBinaryString(b1));//
System.out.println(Integer.toBinaryString(c1));//
System.out.println(Integer.toBinaryString(d1));//
System.out.println(""); //(number - 1) << 1 ****************************************************为什么左移?-->取偶数->大部分是最近的偶数了 //为什么左移
//<<:左移运算符,num << 1,相当于num乘以2
//左移后低位是由0来补充的
//JAVA中没有<<<的,因为左移后低位肯定是由0来补充的 int a2 = a1 << 1;
int b2 = b1 << 1;
int c2 = c1 << 1;
int d2 = d1 << 1;
System.out.println("左移结果----------------------------------");
System.out.println(Integer.toBinaryString(a2));//0 0 1
System.out.println(Integer.toBinaryString(b2));//100 4 3
System.out.println(Integer.toBinaryString(c2));//100 8 5
System.out.println(Integer.toBinaryString(d2));//1110 14 8
System.out.println(""); System.out.println("最终结果----------------------------------");
System.out.println("");
//Integer.highestOneBit((number - 1) << 1) ****************************************************为什么取111的形式然后做了个减法运算?
int a3 = highestOneBit(a2);
int b3 = highestOneBit(b2);
int c3 = highestOneBit(c2);
int d3 = highestOneBit(d2);
System.out.println("1--->"+a3);
System.out.println("3--->"+b3);
System.out.println("5--->"+c3);
System.out.println("8--->"+d3);
System.out.println(""); System.out.println("修正0值----------------------------------");
int fix = 1 >= (1 << 30)
? (1 << 30)
: (1 > 1) ? 0 : 1; int f1 = (1 > 1) ? 0 : 1;
System.out.println("1--->"+f1);
int f2 = 1 >= (1 << 30) ? (1 << 30) : 1;
System.out.println("2--->"+f2);
System.out.println("3--->"+fix);
System.out.println(""); int a4 = 1;//
int b4 = 4;//
int c4 = 8;//
int d4 = 8;//
System.out.println("理想结果----------------------------------");
System.out.println(Integer.toBinaryString(a4));//
System.out.println(Integer.toBinaryString(b4));//
System.out.println(Integer.toBinaryString(c4));//
System.out.println(Integer.toBinaryString(d4));//1000
System.out.println("");
System.out.println("1--->"+a4);
System.out.println("3--->"+b4);
System.out.println("5--->"+c4);
System.out.println("8--->"+d4);
System.out.println(""); System.out.println("测试----------------------------------");
System.out.println(14>>1);//14/2=7
System.out.println(7>>1);//7/2=3
System.out.println(3>>1);//3/2=1
System.out.println(1>>1);//1/2=0
System.out.println(0>>1);//0/2=0 } //0,4,8,14
//14->8
//1110->(这个数的二进制形式最左边的最高一位且高位后面全部补零,最后返回int型的结果)->1000->8
//这个数的二进制形式最左边的最高一位且高位后面全部补零,最后返回int型的结果:说白了就是取离我最近的,比我小的一个2次方的值-----为什么?
//2--->10
//4--->100
//8--->1000
//16--->10000
//32--->100000 public static int highestOneBit(int i) { // HD, Figure 3-1
System.out.println("右移结果");
i |= (i >> 1);
//>>:右移运算符,num >> 1,相当于num除以2
//表示右移,如果该数为正,则高位补0,若为负数,则高位补1 System.out.println("1--->"+Integer.toBinaryString(i));
i |= (i >> 2);
System.out.println("2--->"+Integer.toBinaryString(i));
i |= (i >> 4);
System.out.println("3--->"+Integer.toBinaryString(i));
i |= (i >> 8);
System.out.println("4--->"+Integer.toBinaryString(i));
i |= (i >> 16);
System.out.println("5--->"+Integer.toBinaryString(i)); System.out.println("6--->"+Integer.toBinaryString(i >>> 1)+"(无符号右移)");
//>>>:无符号右移,忽略符号位,空位都以0补齐
//表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0
System.out.println("7--->"+Integer.toBinaryString(i - (i >>> 1))+"(减法运算)");
System.out.println(""); return i - (i >>> 1);
}
//1,4,8,8 /*
这个函数的作用是取 i 这个数的二进制形式最左边的最高一位且高位后面全部补零,最后返回int型的结果。
1、第一步的作用是把最高位1右移移位,并与原数据按位取或。那么这就使得最高位和它的下一位是连续两个1。 2、第二步的作用是把刚刚移位得到连续两个1继续右移两位并与原数据按位取或。那么这就使得最高两位和它的下两个连续位组成四个连续的1。
3、 以此类推,最终得到的i是从开始的最高位到结束全是1。并减去i不带符号的右移一位,即可得到一个int数据的最高位的值。 4、上述情况是针对于i不为零和负数的情况,如果i为零,那么得到的结果始终为零。如果i位负数,那么得到的结果始终是-2147483648。即等于Integer.MIN_VALUE。(原因在于负数的最高位始终为1,即是负数的符号位)
---------------------
本文来自 JessenPan 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/jessenpan/article/details/9617749?utm_source=copy
*/ }

hashMap 临界值初步理解的更多相关文章

  1. javascript 原型及原型链的初步理解

    最近折腾了好久,终于是把js里面的原型和原型链做了个初步的理解: 在这里,我打个比喻: 我(child),我妈constructor(构造函数)生了我:别人问我老妈跟谁生的我,于是此时我妈会指向我爸爸 ...

  2. Spring学习笔记--环境搭建和初步理解IOC

    Spring框架是一个轻量级的框架,不依赖容器就能够运行,像重量级的框架EJB框架就必须运行在JBoss等支持EJB的容器中,核心思想是IOC,AOP,Spring能够协同Struts,hiberna ...

  3. Graph Cuts初步理解

    一些知识点的初步理解_8(Graph Cuts,ing...) Graph cuts是一种十分有用和流行的能量优化算法,在计算机视觉领域普遍应用于前背景分割(Image segmentation).立 ...

  4. 非常易于理解‘类'与'对象’ 间 属性 引用关系,暨《Python 中的引用和类属性的初步理解》读后感

    关键字:名称,名称空间,引用,指针,指针类型的指针(即指向指针的指针) 我读完后的理解总结: 1. 我们知道,python中的变量的赋值操作,变量其实就是一个名称name,赋值就是将name引用到一个 ...

  5. springBoot(1)---springboot初步理解

    springboot初步理解 在没有用SpringBoot之前,我们用spring和springMVC框架,但是你要做很多比如: (1)配置web.xml,加载spring和spring mvc 2) ...

  6. Mysql加锁过程详解(7)-初步理解MySQL的gap锁

    Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...

  7. 关于THINKPHP5模型关联的初步理解

    初步理解的意思是,使用最常用的关联模型,然后可以正常运行 还是打个比方 文章表  和文章分类表 一个文章分类可以有多个文章  所以  文章分类模型和文章建立 hasMany的关联 而文章和文章分类表则 ...

  8. spfa+差分约束系统(C - House Man HDU - 3440 )+对差分约束系统的初步理解

    题目链接:https://cn.vjudge.net/contest/276233#problem/C 题目大意:有n层楼,给你每个楼的高度,和这个人单次的最大跳跃距离m,两个楼之间的距离最小是1,但 ...

  9. Android-自定义控件-继承View与ViewGroup的初步理解

    继承View需要走的流程是: 1.构造实例化, public ChildView(Context context, @Nullable AttributeSet attrs) 2.测量自身的高和宽on ...

随机推荐

  1. ssm redis 数据字典在J2EE中的多种应用与实现

    数据字典在项目中是不可缺少的“基础设施”,关于数据字典如何设计如何实现,今天抽空讲一下吧 先看一下表设计: 通过自定义标签来实现页面的渲染: public class DataDictValueTag ...

  2. 为jqgrid添加统计金额页脚

    为jqgrid增加自定义用户数据 设计统计的金额总和 最后在jgrid组件中添加 最后的效果为:

  3. linq筛选唯一

    var sizelist= (from p in stockList select p.Size).Distinct().ToArray(); newslist = newslist.OrderBy( ...

  4. # tail -f /var/log/zabbix/zabbix_agentd.log sudo: sorry, you must have a tty to run sudo

    /etc/sudoers 1)Defaults requiretty,修改为 #Defaults requiretty,表示不需要控制终端. 2)Defaults requiretty,修改为 Def ...

  5. Fluent UDF【3】:环境配置

    windows操作系统下UDF的编译需要借助Visual Studio中的C编译器.因此若要想编译UDF,则必须事先配置好编译环境. Visual Studio Visual Stuido(后面简称V ...

  6. javascript基础拾遗(十一)

    1.DOM操作 1)查找 //根据id查找 document.getElementById() //根据html标签查找 documnet.getElementByTagName() //根据样式cl ...

  7. python--使用MySQL数据库

    1.安装mysqlsudo apt-get install mysql-server Sudo apt-get install mysql-client 2.安装MySQL-python驱动sudo ...

  8. DIOCP开源项目-DIOCP3重写笔记-1

    这几天在在重新DIOCP3,基本工作已经初步完成,进入测试阶段,今天加入排队投递,本认为是个很简单的工作,稍微不注意,留了两个坑,调了7,8个小时,刚刚总算找到问题,记录一下, 关于排队投递的流程 这 ...

  9. Lua string.gsub (s, pattern, repl [, n])

    lua的string函数导出在string module中.在lua5.1,同时也作为string类型的成员方法,因此,我们既可以写成string.gsub (s,……), 也可以s:gsub(). ...

  10. 2015-07学习总结——网络编程(TCP/IP)

    之前学习的主要内容是单机上的处理,比如编程语言.游戏编程.数据库.多媒体编解码.其实对网络也有些接触,比如WWW.HTTP.UDP/TCP.RTP.RTMP.SNMP.FTP.单播组播.Telnet. ...