浅谈Java位操作
今日热点
利拉德压哨三分绝杀雷霆!一句话:老子利指导,杀人先看表!利指导牛批!
今天补习补习计算机基础知识,Java位操作 。
在说Java的位操作之前,要先说说原码,反码,补码 这三个概念,在学校期间,书本上有关于这个三种码的介绍,是基础知识。但是,在学校期间,基本都没认真听过课…(ps当然学霸除外)
原码
首先要知道计算机最终处理的是0,1这种二进制指令。int型在内存中占4个字节,一个字节是8个bit,即8位。所以int型是32位数据类型。
举个例子:int a = 3;
那么a的原码就是其二进制表示:
00000000 00000000 00000000 00000011
反码
反码是在原码的基础上取反,用上面的例子:
int a = 3;
00000000 00000000 00000000 00000011 (a的原码)
11111111 11111111 11111111 11111100 (a的反码)
补码
补码是在反码的基础上加1:
int a = 3;
00000000 00000000 00000000 00000011 (a的原码)
11111111 11111111 11111111 11111100 (a的反码)
11111111 11111111 11111111 11111101 (a的补码)
负数的二进制表示
是负数的绝对值的补码。上面已经给出结果了,a的补码表示-3.
再举个例子:
int b = -5;
先求b的绝对值的原码:
00000000 00000000 00000000 0101
再取反加1:
11111111 11111111 11111111 1011
所以-5的二进制表示为:11111111 11111111 11111111 1011
右移 >>和>>>
">>"这个操作可能大家见得比较多,但是">>>"这个操作却少见。在正数情况下,>>和>>>没什么区别,在负数情况下,区别就大了,这里举个例子来感受一下:
int c = -7; int c1 = c>>3; int c2 = c>>>3; System.out.println("c1 = "+c1); System.out.println("c2 = "+c2);
控制台打印结果为:
c1 = -1c2 = 536870911Process finished with exit code 0
为什么会打印这种结果呢,我们看看其背后逻辑。
首先是c>>3,我们先把c用二进制表示,c是负数,上面已经说过了二进制表示方法这里就不在赘述了,直接给出结果:
11111111 11111111 11111111 11111001
c>>3表示向右移3位,左边空出来的补1. 所以结果就是:
11111111 11111111 11111111 11111111
表示-1。
我们再看c>>>3,它的意思是向右移3位,左边空出来的补0. 所以结果就是:
00011111 11111111 11111111 11111111
此二进制表示536870911。
与操作&
两个位都为1时,结果才为1
int a = 5,b = 12;
a&b
=>
0101 (a)
&
1100 (b)
=
0100 (4)
或操作|
两个位都为0时,结果才为0
int a = 5,b = 12;
a|b
=>
0101 (a)
|
1100 (b)
=
1101 (13)
异或操作^
两个位相同为0,相异为1
int a = 5,b = 12;
a^b
=>
0101 (a)
^
1100 (b)
=
1001 (9)
取反操作~
0变1,1变0
int a = 5;
0101 (a)
~
1010 (10)
扫码加入我的个人微信公众号:Android开发圈 ,一起学习Android知识!!
你的点赞(在看)与支持,让我更有写作的动力!