关注公众号:”奇叔码技术“
回复:“java面试题大全”或者“java面试题”
即可领取资料
喜爱的源码分析又来了!
1.如果不喜欢位运算想知道JDK1.7的hashmap源码面试总结可直接看最后面即可;
2.文章会携带小部分,___下划线的小题目,用于大脑思考,增强各位同学同志的记忆;
原码、反码、补码的首位称为符号位0为正,首位1为负.
正数:以+5为例,
从右至左数,第一个bit位表示2的0次方为1,第三个bit位表示2的2次方为4,以此类推。即2的2次方+2的0次方=5.
提问,这里的首位(符号位)为0则是正的还是负的呢?
答:(问题一)。
原码 0000 0101
反码 0000 0101
补码 0000 0101
规律:正数的原码、反码、补码是一致的
负数:以-5为例,
提问,这里的首位(符号位)为1则是正的还是负的呢?
答:(问题二)。
原码 1000 0101
反码 1111 1010
补码 1111 1011
规律:
原码:首位即符号位为1为负,其余和正5没区别。
反码:首位即符号位不变,其余位数取反,0变为1,1变为0。
补码:在反码基础上都不变的情况下末尾+1,(bit位是逢2进1再变0).
符号 >> 右箭头为右移动 << 左箭头为左移动,统称为有符号运算.
(1)补码的算数移位,首位即符号位是不变的,仅对数值位进行移位。
(2)正数:>> 右移则表示从最后面去掉bit位,并在最前面补0。即高位补0,低位舍弃。如果舍弃的位为0,相当于/2(除以2);如果舍弃的bit位!=0为1的话,则会丢失精度。
(3)正数:<< 左移则表示向末尾补0 则所有bit位都进位了。即低位补0,高位舍弃。若舍弃的位=0,则相当于*2(乘以2);如果舍弃的bit位!=0为1的话,则会出现严重误差。
(4)负数:>> 右移:高位补1,低位舍弃。一般情况下相当于/2(除以2);如果舍弃的bit位!=0为1的话,则会丢失精度。
(5)负数:<< 左移:低位补0,高位舍弃。一般情况下相当于*2(乘以2);如果舍弃的bit位!=0为1的话,则会出现严重误差。
(6)由于左移动乘以2,右移动除以2是不规律的,最好的就是原码->反码->补码进行转化后,再由补码进行移位和运算再转化为补码->反码->原码,得到的值才是准确的,这也是我们为什么学习原码、反码、补码。
(7)简单来记就是,左移动乘,右移动除。再学习这篇文章之后,自己再动手进行原码、反码、补码进行转化和移位得到精确值吧
5 >> 2 表示 5的补码的bit位向右边移动两位,即是乘以还是除以呢?答:(问题三)。
原码 0000 0101
反码 0000 0101
补码 0000 0001 01(这里注意末尾的01被去掉了,是不要的)
再从补码->反码->原码,由于是正数都是不变的,所以原码依然是 0000 0001
首位为符号位为0,即为正+
从右边往左边数第一个为1,表示2的0次方为1。
得到5 >> 2 值为+1。
5 << 2 表示 5的补码的bit位向左边移动两位,且末尾补0,即是乘以还是除以呢?答:(问题四)。
原码 0000 0101
反码 0000 0101
补码 0001 0100 (这里注意末尾添加了00)
再从补码->反码->原码,由于是正数都是不变的,所以原码依然是 0001 0100
首位为符号位为0,即为正+
从右边往左边数第三个为1,表示2的2次方为4.
从右边往左边数第五个为1,表示2的4次方为16.
得到5 >> 2 值为+20。
-5 >> 2 表示 -5的补码的bit位向右边移动两位,即是乘以还是除以呢?答:(问题五)。
原码 1000 0101
反码 1111 1010
补码 1111 1011
补码右移动两位且高位补1,即左边的数移动到右边时都为1得到 1111 1110(这里注意末尾的11被去掉了,是不要的)
补码移位完成后,还不是结果,还需要进行变换到原码,才是我们的看到的数值。
补码 1111 1110
反码 1000 0001 (保留首位即符号位,其余都取反1变为0,0变为1)
原码 1000 0010 (在反码的基础上末尾+1,(bit位是逢2进1再变0))
首位为符号位为1,即为负-
从右边往左边数第二个为1,表示2的1次方为2.
得到-5 >> 2 值为-2。
-5 << 2 表示 -5的补码的bit位向左边移动两位,即是乘以还是除以呢?答:(问题六)。
原码 1000 0101
反码 1111 1010
补码 1111 1011
补码左移动两位且末尾补0,得到1110 1100(这里注意末尾加了00)
补码移位完成后,还不是结果,还需要进行变换到原码,才是我们的看到的数值。
补码 1110 1100
反码 1001 0011 (保留首位即符号位,其余都取反1变为0,0变为1)
原码 1001 0100 (再反码的基础上末尾+1,(bit位是逢2进1再变0))
首位为符号位为1,即为符-
从右边往左边数第三个为1,表示2的2次方为4.
从右边往左边数第五个为1,表示2的4次方为16.
得到-5 >> 2 值为4+16,20,且为符号得-20。
这里是讲的8位二进制能表示的十进制数范围为(28/2-1)~(-28/2)即[+127,-128],这些数都是8位二进制来玩儿如果移位时有bit位为1超出了第八位则表示溢出会丢失.
如果是两个字节16位二进制范围内的数(216/2-1)~(-216/2)即[32767,-32768],这些数都是16位二进制来玩儿如果移位时有bit位为1超出了第十六位则表示溢出会丢失.
好处:
可以使变量在类中实现共享,在多个类对象之间共享该变量,而不必每个对象都存储一个拷贝
static变量由JVM初始化,不需要显式初始化
static变量可以在类加载时就分配内存,减少了程序运行时才分配内存带来的性能损失
坏处:
由于static变量内存分配固定,当使用大量static变量时,会对系统性能造成压力;
static变量是全局的,一旦发生变动,会对系统产生不可预知的影响;
static变量不能被继承,派生类无法访问父类的静态变量。
问题一:正
问题二:负
问题三:除以
问题四:乘以
问题五:除以
问题六:乘以
如果错误或者有优化的方面,请各位同学同志进行指点迷津哦!一起进步一起成长!也欢迎点赞·在看·转发哟!
点赞
评论
关注我
END
下篇来临!