java魔术数字_Java-数字的魔法

数据类型 字节长度 范围 包装类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; }

....................

后续如果发现一些有意思的关于数字的东西继续更新。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值