1. 程式人生 > >java位運算和無符號運算

java位運算和無符號運算

補碼 二進制補碼 原碼、反碼、補碼 移位運算 不變 運算 負數 system 基礎上

計算機在底層使用的是二進制補碼進行運算。

計算規則:

  正數的原碼、反碼、補碼是其二進制本身。

  負數的原碼首先計算其二進制數,然後最高位使用1表示負數,反碼是最高位不變其它位取反,補碼是在反碼的基礎上進行+1操作。

  System.out.println( 8 >> 1);//正數進行右移位運算

8的二進制是 0000 0000 0000 0000 0000 0000 0000 1000,進行右移1位得到二進制0000 0000 0000 0000 0000 0000 0000 0100,然後轉成二進制是4
  以此類推

   /* 1000
* 0100 4 右移1位
* 0010 2 右移2位
* 0001 1 右移3位
* 0000 0 右移4位
* */

System.out.println( -8 >> 1);//負數進行右移位運算 (右移高位補1)

-8的二進制是1000 0000 0000 0000 0000 0000 0000 1000,這裏最高位1表示是負數

  /*
* 1000 0000 0000 0000 0000 0000 0000 1000 原碼
* 1111 1111 1111 1111 1111 1111 1111 0111 反碼
* 1
* 1111 1111 1111 1111 1111 1111 1111 1000 補碼
* 1 1111 1111 1111 1111 1111 1111 1111 100 位運算得到的是補碼然後轉到原碼
* 1 0000 0000 0000 0000 0000 0000 0000 011
* 1
* 1 0000 0000 0000 0000 0000 0000 0000 100 -4 原碼
* */

   System.out.println(8<<2);//正數進行左移位運算

/*

   * 0000 0000 0000 0000 0000 0000 0000 1000 原碼

   * 0000 0000 0000 0000 0000 0000 0010 0000 位運算 32

   */

   System.out.println(-8<<2);//負數進行左移位運算(左移地位補0)
/* 1000 0000 0000 0000 0000 0000 0000 1000 -8的原碼
* 1111 1111 1111 1111 1111 1111 1111 0111 反碼
* 1111 1111 1111 1111 1111 1111 1111 1000 補碼
* 11 1111 1111 1111 1111 1111 1111 100000 位運算
* 10 0000 0000 0000 0000 0000 0000 011111 位運算之後補碼
* 10 0000 0000 0000 0000 0000 0000 100000 原碼
* -32
* */

  System.out.println(-9>>>2);無符號運算,高位進行補0,低位舍去
/*
* 1000 0000 0000 0000 0000 0000 0000 1001 原碼

   * 1111 1111 1111 1111 1111 1111 1111 0110 反碼
* 1111 1111 1111 1111 1111 1111 1111 0111 補碼
* 001111 1111 1111 1111 1111 1111 1111 01 移位 (移位得到的是正數,所以補碼就是其本身)
* */

java位運算和無符號運算