Java学习笔记2.3.5 运算符与表达式 - 位运算符

Posted howard2005

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java学习笔记2.3.5 运算符与表达式 - 位运算符相关的知识,希望对你有一定的参考价值。

文章目录

零、本讲学习目标

  1. 理解位运算的含义
  2. 掌握位运算的使用

一、位运算符概念

  • 位运算符是针对二进制数的每一位进行运算的符号,它专门针对数字0和1进行操作。

二、位运算符使用

(一)分类说明表

运算符运算范例结果
&按位与a & ba和b每一位进行“与”操作后的结果
|按位或a | ba和b每一位进行“或”操作后的结果
~取反~ aa的每一位进行“非”操作后的结果
^按位异或a ^ ba和b每一位进行“异或”操作后的结果
<<左移a << b将a左移b位,右边空位用0填充
>>右移a >> b将a右移b位,丢弃被移出位,左边最高位用0或1填充
>>>无符号右移a >>> b将a右移b位,丢弃被移出位,左边最高位用0填充
  • 按位与运算真值表
&01
000
101
  • 按位或运算真值表
|01
001
111
  • 按位异或运算真值表
^01
001
110
  • 取反运算真值表
~01
10

(二)注意事项

位运算符本质都是针对二进制数0和1进行运算的,在使用位运算符时,都会先将操作数转换成二进制数的形式进行位运算,然后将得到的结果再转换成想要的进制数。其中,1表示true,0表示false。

(三)案例演示

1、按位与

2、按位或

3、逐位取反

4、按位异或

5、左移

6、右移

7、无符号右移

8、演示各种位运算

package net.hw.lesson05;

/**
 * 功能:演示位运算
 * 作者:华卫
 * 日期:2020年3月22日
 */
public class Example509 
    public static void main(String[] args) 
        int a = 0b00000110;
        int b = 0b00001011;
        // 按位与
        System.out.println(Integer.toBinaryString(a) + " & " + Integer.toBinaryString(b) + " = " + Integer.toBinaryString(a & b));
        // 按位或
        System.out.println(Integer.toBinaryString(a) + " ! " + Integer.toBinaryString(b) + " = " + Integer.toBinaryString(a | b));
        // 逐位取反
        System.out.println("~" + Integer.toBinaryString(a) + " = " + Integer.toBinaryString(~a));
        // 按位异或
        System.out.println(Integer.toBinaryString(a) + " ^ " + Integer.toBinaryString(b) + " = " + Integer.toBinaryString(a ^ b));
        // 左移
        System.out.println(Integer.toBinaryString(b) + " << 1 = " + Integer.toBinaryString(b << 1));
        // 右移
        System.out.println(Integer.toBinaryString(b) + " >> 1 = " + Integer.toBinaryString(b >> 1));
        // 无符号右移
        System.out.println(Integer.toBinaryString(b) + " >>> 1 = " + Integer.toBinaryString(b >>> 1));
    

  • 运行程序,查看结果

9、演示右移与无符号右移的区别

如何才能体现出右移与无符号右移的区别呢?

package net.hw.lesson05;

/**
 * 功能:演示右移与无符号右移的区别
 * 作者:华卫
 * 日期:2020年3月22日
 */
public class Example510 
    public static void main(String[] args) 
        int a = 0b00000111111111111111111111111001;  // 正数
        int b = 0b10000111111111111111111111111001;  // 负数

        // 右移
        System.out.println(Integer.toBinaryString(a) + " >> 1 = " + Integer.toBinaryString(a >> 1));
        // 无符号右移
        System.out.println(Integer.toBinaryString(a) + " >>> 1 = " + Integer.toBinaryString(a >>> 1));
        // 右移
        System.out.println(Integer.toBinaryString(b) + " >> 1 = " + Integer.toBinaryString(b >> 1));
        // 无符号右移
        System.out.println(Integer.toBinaryString(b) + " >>> 1 = " + Integer.toBinaryString(b >>> 1));
    

运行程序,结果如下:

最高位是符号位,0表示正数,1表示负数。
对于正数而言,右移与无符号右移结果相同。
对于负数而言,右移与无符号右移结果不同。

(四)课堂练习

  • 编程计算下列位运算结果
123 & 34
223 | 34
323 ^ 34
4~23
532 >> 2
6-32 >> 2
732 >>> 2
8-32 >>> 2
94 << 3


大家可以对照一下Python的位运算:

大家可以看到,Python里除了没有无符号右移运算符之外,其余位运算符跟Java完全一样。

以上是关于Java学习笔记2.3.5 运算符与表达式 - 位运算符的主要内容,如果未能解决你的问题,请参考以下文章

JAVA笔记学习

JAVA笔记学习

JAVA笔记学习

JAVA笔记学习

Java学习笔记2.3.7 运算符与表达式 - 运算优先级与表达式

Java学习笔记2.3.3 运算符与表达式 - 关系运算符