今天补习补习计算机基础知识,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

右移 >>和>>>

”>>“这个操作可能大家见得比较多,但是”>>>“这个操作却少见。在正数情况下,>>和>>>没什么区别,在负数情况下,区别就大了,这里举个例子来感受一下:

1
2
3
4
5
				int c = -7;
        int c1 = c>>3;
        int c2 = c>>>3;
        System.out.println("c1 = "+c1);
        System.out.println("c2 = "+c2);

控制台打印结果为:

1
2
3
4
c1 = -1
c2 = 536870911

Process 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)


个人微信公众号