• 目录

位运算符

阅读量: 514 编辑

位运算符

计算机的最底层就是 0 , 1 两个数字,比如 int a = 8; 那么在计算机上其实是用 1000 来表示的,从低位开始,就是:0*2^0 + 0*2^1 + 0*2^2 + 1*2^3,结果就是 1*2^3 = 8

一、符号介绍

计算机是二进制的表示,比如 int 类型是32位:00000000 00000000 00000000 00000000 ,即32个0表示十进制0

// 11 和 12 都是10进制的。在编程中我们是使用10进制表达的,但是计算机存储是按照二进制存储的
int a = 11;  // 二进制:00000000 00000000 00000000 00001011,或者 1011
int b = 12;  // 二进制:00000000 00000000 00000000 00001100,或者 1100

二、位运算符规则

与(&) 0 & 0 = 0 1 & 0 = 0 0 & 1 = 0 1 & 1 = 1
或(|) 0 | 0 = 0 1 | 0 = 1 0 | 1 = 1 1 | 1 = 1
异或(^) 0 ^ 0 = 0 1 ^ 0 = 1 0 ^ 1 = 1 1 ^ 1 = 0
与:两个都是1,结果是1

或:只要有一个是1,结果就是1

异或:0异或任何数结果都是那个数,1异或任何数结果就是那个数取反
  • 按位与(&) : a & b 结果是 1000

  • 按位或(|) : a | b 结果是 1111

  • 按位异或(^) : a^b 结果是 111

  • 按位右移(>>) : a >> 2 结果是 10 ; 向右移动2位(去掉最右边的2位),左边补0

  • 按位左移(<<) : a << 2 结果是 101100 ; 向左移动2位(去掉最左边的2位),右边补0

  • 按位非(~) : ~a 结果是 10000000 00000000 00000000 00001100

// ~a 参考如下四步进行:

00000000 00000000 00000000 00001011     //先获得 a 的二进制表达
    
11111111 11111111 11111111 11110100        //将所有位取反
    
10000000 00000000 00000000 00001011     //第一位符号位不变,其他位再取反
    
10000000 00000000 00000000 00001100     //然后 +1,满2进1,最终得到的是 -12

三、代码实战

代码的详细解读,可以参考视频教程

package com.qicong.cj;

/**
 * User: 祁大聪
 */
public class C18 {

    public static void main(String[] args) {
        int a = 11; //1011
        int b = 12; //1100

        System.out.println(a & b);    //1000
        System.out.println(a | b);      //1111
        System.out.println(a ^ b);     //111
        System.out.println(~a);         //10000000 00000000 00000000 00001100
        System.out.println(a << 2);   //101100
        System.out.println(a >> 2);   //10
        
    }
    
}


  • 目录