Bit manipulation

难点:二进制运算的意义,数字的范围

操作:移位,一元操作符

  • 数字的位数和范围

可直接在java常见包装类中调用MIN_VALUEMAX_VALUE进行查看。但是常识还是需要一些记忆。溢出之后会在min和max值中相互转换。

基本类型:byte 二进制位数:8
包装类:java.lang.Byte
最小值:Byte.MIN_VALUE=-128 // 0x80000000;
最大值:Byte.MAX_VALUE=127  // 0x7fffffff;

基本类型:short 二进制位数:16
包装类:java.lang.Short
最小值:Short.MIN_VALUE=-32768
最大值:Short.MAX_VALUE=32767

基本类型:int 二进制位数:32
包装类:java.lang.Integer
最小值:Integer.MIN_VALUE=-2147483648
最大值:Integer.MAX_VALUE=2147483647

基本类型:long 二进制位数:64
包装类:java.lang.Long
最小值:Long.MIN_VALUE=-9223372036854775808
最大值:Long.MAX_VALUE=9223372036854775807

基本类型:float 二进制位数:32
包装类:java.lang.Float
最小值:Float.MIN_VALUE=1.4E-45
最大值:Float.MAX_VALUE=3.4028235E38

基本类型:double 二进制位数:64
包装类:java.lang.Double
最小值:Double.MIN_VALUE=4.9E-324
最大值:Double.MAX_VALUE=1.7976931348623157E308

基本类型:char 二进制位数:16
包装类:java.lang.Character
最小值:Character.MIN_VALUE=0
最大值:Character.MAX_VALUE=65535

取值范围问题,为什么是[-2^31, 2^31)? 因为2^32刚好溢出变成负数

>>> bin(int('80000000', 16))[2:]
'10000000000000000000000000000000'
>>> len(bin(int('80000000', 16))[2:])
32
>>> bin(int('7fffffff', 16))[2:]
'1111111111111111111111111111111'

取最右边的1出现的位置:diff & -diff

优先级

两个容易搞错的优先级,加号:1 + (num >>> 1)(n & 1) == 1

+, >>>, ==, &

%和&互换:a % 2^n = a & (2^n - 1)

results matching ""

    No results matching ""