(随笔)位运算和移位运算D

来源:互联网 发布:淘宝收入排行榜2015 编辑:程序博客网 时间:2024/06/07 08:35
计算机二进制(原码 反码 补码)
位运算 移位运算
>>算术右移
<<算术左移
>>>逻辑右移
二进制的基本概念 逢二进一
一个int 4个字节 一个字节等8位
对于有符号的数而言:
1;二进制的最高位是符号位:0表正数1表示负数
2:正数的原码、反码、补码均相同
3:负数的反码=它的原码符号位不变,其他位取反(0-1 1-0)
4:负数的补码=负数的反码+1
5:0的反码补码均为0
6:java中的数均是有符号的
7:在计算机运行过程中均是已补码方式来运算。
1-2:
-2的原码:100........010
-2的反码:111........101
-2的补码:111........110
1的补码加上-2的补码:
111......111—运算结果的补码
111......110—运算结果的反码
100......001—运算结果的原码 为-1

位运算 移位运算:
位运算符: 按位与& 按位或| 按位异或^ 按位取反
按位与&:两个全为1,结果为1
按位或|:两个有一个为1,结果为1
按位异或^: 两位有一个为0 一个为1 结果为1
按位取反~:0-1 1-0;

~2(对2取反):
000.......010  取反为
111.......101  此为结果补码
111.......100  此为结果反码
100.......011  次为结果原码 结果为-3;
2&3:
000.......010
000.......011 进行按位与的运算
000.......010 结果为正数 为2  
2|3:
000.......010
000.......011 进行按位或的运算
000.......011 结果为正数 为3

~-5(-5取反)
100.......101 -5的原码
111.......010 -5的反码
111.......011 -5的补码
000.......100 结果为正数 故为4

-3^3:
100.......011 -3的原码
111.......100 -3的反码
111.......101 -3的补码
000.......011  3的补码
111.......110 结果的补码
111.......101 结果的反码
100.......010 结果的原码   故结果-2

>>算术右移:低位溢出 符号位不变,并用符号位补溢出的高位
<<算术左移:符号位不变 低位补0;
>>>逻辑右移:低位溢出 高位补0

1>>2:
000......001算术右移两位
000......000 为0
-1>>2
100......001 -1的原码
111......110 -1的反码
111......111 -1的补码 进行右移
111......111   结果的补码
111......110   结果的原码
100......001   结果为-1

1<<2
000......001 算术向左移两位4
-1<<2
100......001 算术向左移两位-4(符号位不变)

3>>>2
000......011 向右移动两位 为0


算术左移和算术右移:算术左移符号位不变,而算术右移则符号位不变且换算为补码进行移位运算

逻辑左移和逻辑右移:两者均不必考虑符号位

算术左移和逻辑左移:算术左移会产生溢出,逻辑左移则不会产生溢出

public class Demo2 {public static void main(String[] args) {// TODO Auto-generated method stub     Demo3 d3=new Demo3();     d3.a();}}class Demo3{public void a(){System.out.println("~2="+(~2));System.out.println("2&3="+(2&3));System.out.println("2|3="+(2|3));System.out.println("~-5="+(~5));System.out.println("-3^3="+(-3^3));System.out.println("1>>2="+(1>>2));System.out.println("-1>>2="+(-1>>2));    System.out.println("1<<2="+(1<<2));    System.out.println("-1<<2="+(-1<<2));    System.out.println("3>>>2="+(3>>>2));    }}

运行结果为以上。

0 0
原创粉丝点击