[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?

[ 英语 ] 奇怪的知识又增加了之——中文和英文在口语读法上的差别

求一个简单又有趣的JAVA小游戏代码

你为什么要补缴个税(yeah,不搭边儿的知识又增加了)

你为什么要补缴个税(yeah,不搭边儿的知识又增加了)

用python玩推理游戏还能掌握基础知识点,有趣又充实,你不试试吗?