[Java] 有趣的知识又增加了之 —— &运算的特殊用法
Posted 削尖的螺丝刀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Java] 有趣的知识又增加了之 —— &运算的特殊用法相关的知识,希望对你有一定的参考价值。
🚫 [Notice: 本篇100%纯手敲原创,未经许可,严禁转载]
我们都知道 &运算 的规则是两个二进制数之间同为1时则结果为1,比如 0000 0011 & 0000 0101 = 0000 0001 ,但除了对规则的认识之外你还知道它的特殊用途吗?如果不知道的话,今天就由俺带大伙儿领略一下~
1. [ 取余数 ] —— 当x=2^n(n为自然数)时,a % x == a & (x - 1 )
废话不多说,直接举例:65539 % 65536 == 65539 & (6553-1)
int i1 = 65539 % 65536;
int i2 = 65539 & 65535;
System.out.println("i1的值为:" + i1 + " i2的值为:" + i2);
System.out.println("i1 == i2:" + (i1 == i2));
结果:
i1的值为:3 i2的值为:3
i1 == i2:true
2.1 [ 取x个低位 ],a & ( 1<<x ) - 1
废话不多说直接举例:取int: 65539 的 低16位
int bitNum = (1 << 16) - 1;
int i1 = 65539;
int i2 = 65539 & bitNum;
System.out.println("bitNum的二进制为:" + Integer.toBinaryString(bitNum));
System.out.println("65539的二进制为:" + Integer.toBinaryString(i1));
System.out.println("&运算后,得出65539的低16位结果为:" + Integer.toBinaryString(i2));
(我们都知道int默认为4字节——32位,但是JAVA只会从第一个高位为1的位置打印出结果,为了方便查看,我把没打印出来的0补上了)结果为:
bitNum的二进制为:00000000 00000000 11111111 11111111
65539的二进制为:00000000 00000001 00000000 00000011
&运算后,得出65539的低16位结果为:00000000 00000000 00000000 00000011
2.2 [ 补充 ],既然知道了取低位,那取x个高位呢?——向右移动x位即可
废话不多说直接举例:取int: 65539 的 高16位
int i1 = 65539 >>> 16;
System.out.println("65539的二进制为:" + Integer.toBinaryString(65539));
System.out.println("右移16位,得出65539的高16位二进制为:" + Integer.toBinaryString(i1));
(我们都知道int默认为4字节——32位,但是JAVA只会从第一个高位为1的位置打印出结果,为了方便查看,我把没打印出来的0补上了)结果为:
65539的二进制为:00000000 00000001 00000000 00000011
右移16位,得出65539的高16位二进制为:00000000 00000000 00000000 00000001
3. [ 右移x个数相当于 —— a / 2^x ]
废话不多说直接举例:2 / 2^1
int i1 = 2 / 2;
int i2 = 2 >>> 1;
System.out.println("i1的值为:" + i1 + " i2的值为:" + i2);
System.out.println("i1 == i2:" + (i1 == i2));
结果为:
i1的值为:1 i2的值为:1
i1 == i2:true
4. [ 左移x个数相当于 —— a * 2^x ]
废话不多说直接举例:2 * 2^1
int i1 = 2 * 2;
int i2 = 2 << 1;
System.out.println("i1的值为:" + i1 + " i2的值为:" + i2);
System.out.println("i1 == i2:" + (i1 == i2));
结果为:
i1的值为:4 i2的值为:4
i1 == i2:true
结束语: 像这样的特殊运算操作在很多源码里经常见到,除了取高低位等特殊需求外,它的速度也比直接使用数学符号运算要快。
🌸 完结,撒花 ~
以上是关于[Java] 有趣的知识又增加了之 —— &运算的特殊用法的主要内容,如果未能解决你的问题,请参考以下文章
[ Redis ] 有趣的知识又增加了之 —— 为什么Redis的有序集合 “Sorted Set“ 取名为ZSet?