文章目录
零、本讲学习目标
- 理解位运算的含义
- 掌握位运算的使用
一、位运算符概念
- 位运算符是针对二进制数的每一位进行运算的符号,它专门针对数字0和1进行操作。
二、位运算符使用
(一)分类说明表
| 运算符 | 运算 | 范例 | 结果 | 
|---|---|---|---|
| & | 按位与 | a & b | a和b每一位进行“与”操作后的结果 | 
| | | 按位或 | a | b | a和b每一位进行“或”操作后的结果 | 
| ~ | 取反 | ~ a | a的每一位进行“非”操作后的结果 | 
| ^ | 按位异或 | a ^ b | a和b每一位进行“异或”操作后的结果 | 
| << | 左移 | a << b | 将a左移b位,右边空位用0填充 | 
| >> | 右移 | a >> b | 将a右移b位,丢弃被移出位,左边最高位用0或1填充 | 
| >>> | 无符号右移 | a >>> b | 将a右移b位,丢弃被移出位,左边最高位用0填充 | 
- 按位与运算真值表
| & | 0 | 1 | 
|---|---|---|
| 0 | 0 | 0 | 
| 1 | 0 | 1 | 
- 按位或运算真值表
| | | 0 | 1 | 
|---|---|---|
| 0 | 0 | 1 | 
| 1 | 1 | 1 | 
- 按位异或运算真值表
| ^ | 0 | 1 | 
|---|---|---|
| 0 | 0 | 1 | 
| 1 | 1 | 0 | 
- 取反运算真值表
| ~ | 0 | 1 | 
|---|---|---|
| 1 | 0 | 
(二)注意事项
位运算符本质都是针对二进制数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表示负数。
 对于正数而言,右移与无符号右移结果相同。
 对于负数而言,右移与无符号右移结果不同。
(四)课堂练习
- 编程计算下列位运算结果
1、23 & 34
2、23 | 34
3、23 ^ 34
4、~23
5、32 >> 2
6、-32 >> 2
7、32 >>> 2
8、-32 >>> 2
9、4 << 3

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










