位运算符号

 >> 算术右移  ===> a>>b : a/(2 的b%32)次方

<< 左移位运算 ===> a << b : a*2(b次方)

1  算术右移位操作符

舍弃二进制的最后N位,在二进制数的开头增加N位符号位。

如果是负数故增加的两个符号位为11。

 exp1:



  int a1 = 12 >>1; //变量a1取值为6



12的二进制表达式:



0000 1100



      || 12 >> 1 右移动一位



0000 0110



十进制为6

------------------------------------------

exp2:

int a=12 >>2 ; //-3

+12 == > -12

0000 1100

|-取反

1111 0011

|-加1

1111 0100 <-- -12 二进制形式

|

1111 1101 <-- -12是负数故增加两个符号位为11

|

1111 1101 <--负数 --> 正数 

1111 1100 1) -1

0000 0011 2) 取反

| 

3 

| 由于负数故为 -3 
公式运算

a >> b ==> a/2 (b%32)

例如 :

        12 >> 1 ==> 12/2 (1 次方) = 6

        12 >> 33 ==> 12/2 (1次方) = 6

        -12 >> 2 ==> -12/2 (2次方 ) = -3

         -12 >> 66 ==> -12 /2 (66%32) = -12/2(2 次方) = -3

        128 >>2 ==> 128/2 (2%32) = 128/2 (2次方)= 32

2  算术左移位操作符

舍弃二进制数开头一位数。在二进制数尾部增加一位0。

a << b ===> a*2(的b次方)

例子:

1 int a1 = 12<< 1; //24

2 int a2 = -12 << 2;// -48

3 int a3 = 128 << 2; //512

4 int a4 = 129 << 2; // 516

 

1 .

1

-----------------------------------------

12 的二进制表达形式

0000 0000 0000 1100

去掉最右边的一位,最左边填充一个0

0000 0000 0001 1000

||

\/

等价于 24

2

-----------------------------------------

-12 的二进制

2.1 12 的二进制

0000 0000 0000 1100

2.2 取反

1111 1111 1111 0011

2.3 +1

1111 1111 1111 0100

2.4 left move 2 bit

<delete the first 2 bit, and append 2 bit in the last of the string>

1111 1111 1101 0000

3 变成十进制数的形式

3.1 负数变正数 第一步-1

1111 1111 1100 1111

3.2 负数变正数第二步 取反

0000 0000 0011 0000

||

\/

48 

||

\/

由于是负数故为 -48 



3 

----------------------------------------------

int a3 = 128 << 2;

3.1 128 binary bit

0000 0000 1000 0000

3.2 left move 2 bit 舍弃二进制开头两位,在尾部补上两位0

0000 0010 0000 0000

||

\/

512



4

-------------------------------------------------

int a4 = 129 << 2; //516

129的二进制

0000 0000 1000 0001

左移动两位

0000 0010 0000 0100

||

\/

516

 

你可能感兴趣的:(位运算)