流年似水博客开通了,本站主要是写关于Web和大数据方面内容,正在更新中,欢迎大家光临!
  1. 文章:97 篇
  2. 总浏览:69,698 次
  3. 评论:22条
  4. 最后更新:2020-06-08
  5. 分类目录:39 个

Java之位运算符详解

Java l, xy 423℃ 0评论

Java之运算符详解

进制

生活中的进制:十进制、六十进制

计算机中常用进制:

  • 二进制:

    • 组成:1,2
    • 规则:满2进1
    • 表示:以0b 或者 0B 开头
  • 八进制:

    • 组成:1-7
    • 规则:满8进1
    • 表示:以0开头
  • 十进制:

  • 十六进制

    • 组成:0-9 A、B、C、D、E、F
    • 规则:满16进1
    • 表示:以0X 或者 0x 开头
  • 进制之间的转换(略)

    • 其他进制转十进制
    • 十进制转其他进制

二进制原码、反码、补码

  • 正数

    • 正数的原码、反码、补码相同
    • 符号位为0
  • 负数 :符号位为1

    • 原码:符号位为1,其余部分和正数相同
    • 反码:原码取反(其中符号位不变,其他位取反)
    • 补码:反码 + 1

 

位运算符(操作的都是二进制的补码,只针对整数,小数不可以; 符号位在位运算中也参与运算

  • 左移:

    • 符号: <<
    • 运算规则:

a << b 将a的二进制补码想左移动b位,空缺位补0 ; 运算结果相当于 ==>  a * 2^b

案例:  3 << 2  = 3 * 2^2 = 12

右移

    • 符号: >>
    • 运算规则:

      • a>> b a的二进制补码向右移动b位,左侧空缺位使用符号位补齐
      • 得到结果相当于 a / (2^b)
    • 举例: 3 >>2 = 3 / 2 ^2 = 0

注意负数不一样

无符号右移

    • 符号: >>>
    • 运算规则:

      • a>> b a的二进制补码向右移动b位,左侧空缺位使用0补齐
      • 得到结果相当于 a / (2^b)
    • 举例: 3 >>>2 = 3 / 2 ^2 = 0

按位与

    • 符号: &
    • 运算规则: a & b 整数a的二进制补码与整数b的二进制补码按位与,最低位对其,两者都为1时结果为1,否则为0
    • 3 & 2 = 2

按位或

    • 符号: |
    • 运算规则:a | b 整数a的二进制补码与整数b的二进制补码按位或,最低位对其。两者都为0时,结果为0。只要要一个为1是,结果为1
    • 案例: 3 | 2 = 3

按位异或

    • 符号: ^
    • 运算规则:如果两个数相同为0,不同为1
    • 案例:3 ^ 2 = 1
    • 规则: a ^ b ^ b = a           a ^ b ^ a = b

应用:交换两个正数

int a = 10;
int b = 20;
//交换前: a = 10   b = 20
System.out.println("交换前: a = " + a + "\t b = " + b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
// 交换后: a = 20  b = 10
System.out.println("交换后: a = " + a + "\t b = " + b);

取反:

    • 符号:~
    • 运算规则: 按位取反
    • 案例: ~2 = -3

知识点零:

注意:java中所有的二进制操作符都是操作数字的补码---重要! 

知识点一:& (与运算符)

1.特点:二元操作符,操作两个二进制数据;两个二进制数最低位对齐,只有当两个对位数都是1时才为1,否则为0
2.案例:
    int a = 3 & 2 ; 
    System.out.println(a); //结果为 2 
3.分析:
    3的二进制补码表示为:
        00000000 00000000 00000000 00000011
    2的二进制补码表示为:
        00000000 00000000 00000000 00000010
    运算:3 & 2 
        00000000 00000000 00000000 00000011
    &   00000000 00000000 00000000 00000010
    -------------------------------------------
        00000000 00000000 00000000 00000010            二进制是2  

知识点二:| (或运算符)

1.特点:二元操作符,操作两个二进制数据;两个二进制数最低位对齐,当两个对位数只要有一个是1则为1,否则为0
2.案例:
    int a = 3 | 2 ; 
    System.out.println(a); //结果为 3 
3.分析:
    3的二进制补码表示为:
        00000000 00000000 00000000 00000011
    2的二进制补码表示为:
        00000000 00000000 00000000 00000010
    运算:3 | 2 
        00000000 00000000 00000000 00000011
    |   00000000 00000000 00000000 00000010
    -------------------------------------------
        00000000 00000000 00000000 00000011            该补码对应十进制为3  

知识点三:^ (异或运算符)

1.特点:二元操作符,操作两个二进制数据;两个二进制数最低位对齐,只有当两个对位数字不同时为1,相同为0
2.案例:
    int a = 3 ^ 2 ; 
    System.out.println(a); //结果为 1 
3.分析:
    3的二进制补码表示为:
        00000000 00000000 00000000 00000011
    2的二进制补码表示为:
        00000000 00000000 00000000 00000010
    运算:3 ^ 2 
        00000000 00000000 00000000 00000011
    ^   00000000 00000000 00000000 00000010
    -------------------------------------------
        00000000 00000000 00000000 00000001           该补码对应十进制为1 

知识点四:~ (非运算符)

1.特点:一元操作符,
2.规则:生成与输入位相反的值--若出入0,则输出1;若输入1,则输入0
3.案例:
    int a = ~ 2 ; 
    System.out.println(a); //结果为 
4.分析:
     2的二进制补码表示为:
        00000000 00000000 00000000 00000010
     运算:
      ~  00000000 00000000 00000000 00000010
    ------------------------------------------
         11111111 11111111 11111111 11111101   //该补码对应十进制为:-3

知识点五:<<(左移运算符)

0.形式: m << n 
1.特点:二元操作符,m数字二进制向左移动n位的结果;结果相当于: m*(2的n次方)
2.案例:
    int a = 3 << 2 ; 
    System.out.println(a); //结果为 12 
3.分析:
    3的二进制补码表示为:
        00000000 00000000 00000000 00000011

    运算:3 << 2 
            00000000 00000000 00000000 00000011
    << 2  
    -------------------------------------------
            00000000 00000000 00000000 00001100            该补码对应十进制为12 

知识点六:>> (右移运算符)

0.形式: m >> n 
1.特点:二元操作符,m数字二进制向右移动n位的结果;结果相当于: m / (2的n次方) 的结果向上取整
2.案例:
    int a = 3 >> 2 ; 
    System.out.println(a); //结果为 0 
3.分析:
    3的二进制补码表示为:
        00000000 00000000 00000000 00000011

    运算:3 >> 2 
            00000000 00000000 00000000 00000011
    >> 2  
    -------------------------------------------
            00000000 00000000 00000000 00000000           该补码对应十进制为0
4.注意: 最后的11向右移动两位,正好补上左边补上0; 所以结果为0             

知识点七:>>> (无符号右移运算符)

1.二元操作符
2.特点:它使用0扩展,无论正负都在最高位补0 
3.案例:
    int a = 3 >>> 2 ; 
    System.out.println(a); //结果为 0 
4.分析:
    3的二进制补码表示为:
        00000000 00000000 00000000 00000011
    运算:
        00000000 00000000 00000000 00000011
    >>>2
    ------------------------------------------
        00000000 00000000 00000000 00000000 

八、附上java编程思想里面关于位操作符的描述

这里写图片描述

这里写图片描述

转载请注明:流年似水 » Java之位运算符详解

喜欢 (0)or分享 (0)

Warning: copy(https://cn.gravatar.com/avatar/?s=54&d=%2Fwp-content%2Fthemes%2Fyusi1.0%2Fimg%2Fdefault.png&r=g): failed to open stream: HTTP request failed! HTTP/1.1 400 Bad Request in /usr/share/nginx/html/timewentby/wp-content/themes/yusi1.0/functions.php on line 239

Warning: copy(/wp-content/themes/yusi1.0/img/default.png): failed to open stream: No such file or directory in /usr/share/nginx/html/timewentby/wp-content/themes/yusi1.0/functions.php on line 243
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址