# 位運算

  • 數據在計算機中是以二進制的方式存放
  • 位元運算:對整數的二進制進行操作
    假設: a = 0110 1001Bb = 0101 110B
a01101001B
b01011100B

# 位運算子

二元運算子功能邏輯
&按位 “與”and
|按位 “或”or
^按位 “異或”xor
~按位 “變反”not

# 複合位運算子

二元運算子功能範例說明
&=複合與x &= y令 x = x & y
|=複合或x |= y令 x = x | y
^=複合異或x ^= y令 x = x ^ y

# 運算結果

  • 按位 “與” <整數A> & <整數B>
    皆為 1 才為 1
A0011
B0101
結果0001
  • 按位 “或” <整數A> | <整數B>
    任一者為 1 就為 1
A0011
B0101
結果0111
  • 按位 “異或” <整數A> ^ <整數B>
    兩者不同才為 1
A0011
B0101
結果0110
  • 按位 “變反” ~<整數A>
    0➡️1,1➡️0
A0011
結果1100
  • 位移運算
    使數值左移或右移指定的位數,如:左移兩位
八位數76543210
初始值01101001
左移兩位01101001空位 補 0
结果值溢出抹去10100100

# 應用

  • 運用按位 “與” 可以將某些位設置為 0
    例如:我想將數字 a 的後半部變成 0,只要其跟 0 做運算即可
a= 01101001B
&b= 11110000B
c= 01100000B
  • 運用按位 “或” 可以將某些位設置為 1
    例如:我想將數字 b 的前半部都轉成 1,只要跟其跟 1 做運算即可
a= 01101001B
|b= 11110000B
c= 11111001B
  • 運用按位 “異或” 可以將某些位相反,部分位保持不變
    • 和 1 “異或” 變反
      • 1^1 = 0
      • 0^1 = 1
    • 和 0 “異或” 不變
      • 0^0 = 0
      • 1^0 = 1

例如:我想要將數字 a 的前半部變反,後半部保持不變

a= 01101001B
^b= 11110000B
c= 10011001B

# 位移運算子

位移運算子的目的是向左或向右移動目標運算元的每個位元

二元運算子功能邏輯
<<保留正負號的左移a <<b (將 a 向左移 b 個單元)
>>保留正負號的右移a >> b (將 a 向右移 b 個單元)
>>>純粹的右移a >>> b

# 複合位移運算

二元運算子功能範例說明
<<=複合左移x <<= y令 x = x << y
>>=複合右移x >>= y令 x = x >> y
>>>=複合右移x >>>= y令 x = x >>> y

# 運算結果

  • 無負號運算
int a = 16;
int b = 2;
System.out.println( a << b );  // 64
System.out.println( a >> b );  // 4
System.out.println( a >>> b ); // 4
  • 有負號運算
int a = -16;
int b = 2;
System.out.println( a << b ); // -64
System.out.println( a >> b ); // -4
System.out.println( a >>> b ); // 1073741820

# 應用

  • 運用位移運算子可以高速的運算 *2/2 運算!!
int a = 3;
System.out.println(a * 2 * 2 * 2 * 2 * 2); // 96 
System.out.println(a << 5); // 96
int b = 20000;
System.out.println(b / 2 / 2 / 2 / 2 / 2); // 625
System.out.println(b >> 5); // 625
更新於 閱讀次數

用實際行動犒賞爆肝的我😀

Zrn Ye LinePay

LinePay