数据类型 字节长度 范围 包装类int 4 31~231-1) Integer
short 2 -32768~32767 Short
long 8 63~263-1) Long
byte 1 -128~127 Byte
float 4 32位IEEE754单精度范围 Float
double 8 64位IEEE754双精度范围 Double
char 2 Unicode[0,65535] Charactor
boolean 1 true,false Boolean
byte n = 127; byte m = (byte) 128; System.out.println("n>m:"+(n>m));
2、存在一个数N,N != 0 使得 N = -N;
3、存在一个数N,使得 N = N + 1;
4、存在一个数N,使得 N = N -1;
double n = Double.POSITIVE_INFINITY; System.out.println(n == n+1);
double n = Double.NEGATIVE_INFINITY; System.out.println(n == n-1);
public static final double POSITIVE_INFINITY = 1.0 / 0.0; public static final double NEGATIVE_INFINITY = -1.0 / 0.0;
5、存在一个数N,使得 N != N;
这个事情其实算不上一个绕的问题,在Java中有定义这样一个数,说是数,但定义的目的不是数。说不是数,但类型是数。这个玩意就是 NaN。
/** * A constant holding a Not-a-Number (NaN) value of type * {@code double}. It is equivalent to the value returned by * {@code Double.longBitsToDouble(0x7ff8000000000000L)}. */ public static final double NaN = 0.0d / 0.0;
/** * A constant holding a Not-a-Number (NaN) value of type * {@code float}. It is equivalent to the value returned by * {@code Float.intBitsToFloat(0x7fc00000)}. */ public static final float NaN = 0.0f / 0.0f;
注意了,这个玩意可只有浮点型数据才可以这么玩哦。
6、“>>”、“>>>”、“<
首先 >> 、>>> 都是Java中的右移操作,“>>”是有符号右移,“>>>”是无符号右移。顾名思义,有符号须得在右移过程中保持符号,所以,有符号右移,若是正数则在高位补0,反之补1,无符号右移不管正负都补0.
特别注意点:对于char、byte、short等类型。在运算时候会先进行int类型的转换。都知道int类型4个字节,32位。所以,如果说右移的位数超过了32,那也是没有用滴。Java采用了取余数的方式来保证右移位数的有效性,即 n>>m相当于 n>>(m%32); 右移相当于做除法操作
即 0000 0000 0000 0000 0000 0000 0000 0100,如果进行<<3操作,也就是左移三位,去掉头上三个0,后面再补上三个:0000 0000 0000 0000 0000 0000 0010 0000,换算成十进制就是32,所以左移也就是乘法运算。同样的,如果你的左移位数大于32位,其实际左移位数位 对32 取余数的值
7、 怎么判断一个数是不是2的n次方
01
12
0000 0000 0000 0000 0000 0000 0000 0100 22
0000 0000 0000 0000 0000 0000 0000 1000 23
0-1 0
1-1 1
0000 0000 0000 0000 0000 0000 0000 0011 22
3
再观察两组数据。发现好像还能做点什么,哎,如果我们将 (0&1)放在一起,一眼就可以看出结果为0,那么其他的呢。不出意外的,其他数字与上减一后的值都是0.所以这个问题又有了新的解答。
判断一个数是不是2的N次方,可以将这个数减一跟自身做与运算,结果如果为零,则表示为2的N次方,反之则不是。。这种方式相对于上一种显然具有很大的优势。
8、给定一个数,求这个数二进制中 1 的个数
0-1 0
1-1 1
2
3
首先我们还是给出这组数字。如果从下往上看,不难找到上面的数字都是可以由下面的数字通过右移得到的。所以我们可以通过一个一个的右移操作观察最后一位数字是不是1来统计个数。
public int count(int n){ int count = 0; while(n>0){ //判断最后一位是不是1 if((n & 1)==1){ count ++; } n >>= 1; } return count; }
对于每次 n & (n-1) 的计算,都会消除掉末尾的1,所以,上述代码还可以改写成
public static int count(int n){ int count = 0; while(n>0){ n = n & (n-1); count ++; } return count; }
....................
后续如果发现一些有意思的关于数字的东西继续更新。。。。。