Ruby位运算符 #

一、位运算符概述 #

位运算符直接对整数的二进制位进行操作。

运算符 描述 示例
& 按位与 5 & 3
| 按位或 5 | 3
^ 按位异或 5 ^ 3
~ 按位取反 ~5
<< 左移 5 << 1
>> 右移 5 >> 1

二、二进制基础 #

2.1 二进制表示 #

ruby
0b1010
0b1010.to_s(2)
10.to_s(2)
"%b" % 10
"%08b" % 10

2.2 十六进制表示 #

ruby
0xff
0xff.to_s(16)
255.to_s(16)
"%x" % 255
"%02x" % 255

2.3 进制转换 #

ruby
"1010".to_i(2)
"ff".to_i(16)
10.to_s(2)
10.to_s(16)
10.to_s(8)

三、按位与(&) #

3.1 基本用法 #

ruby
5 & 3
0b101 & 0b011
(5 & 3).to_s(2)

3.2 运算规则 #

text
  101 (5)
& 011 (3)
  ---
  001 (1)

3.3 应用场景 #

ruby
def even?(n)
  n & 1 == 0
end

even?(4)
even?(5)

def get_low_bits(n, bits)
  n & ((1 << bits) - 1)
end

get_low_bits(0b11010110, 4)

四、按位或(|) #

4.1 基本用法 #

ruby
5 | 3
0b101 | 0b011
(5 | 3).to_s(2)

4.2 运算规则 #

text
  101 (5)
| 011 (3)
  ---
  111 (7)

4.3 应用场景 #

ruby
def set_bit(n, bit)
  n | (1 << bit)
end

set_bit(0b1000, 1).to_s(2)

PERMISSION_READ = 0b001
PERMISSION_WRITE = 0b010
PERMISSION_EXECUTE = 0b100

permissions = PERMISSION_READ | PERMISSION_WRITE
permissions.to_s(2)

五、按位异或(^) #

5.1 基本用法 #

ruby
5 ^ 3
0b101 ^ 0b011
(5 ^ 3).to_s(2)

5.2 运算规则 #

text
  101 (5)
^ 011 (3)
  ---
  110 (6)

5.3 应用场景 #

ruby
def toggle_bit(n, bit)
  n ^ (1 << bit)
end

toggle_bit(0b1010, 1).to_s(2)

def swap(a, b)
  a = a ^ b
  b = a ^ b
  a = a ^ b
  [a, b]
end

swap(10, 20)

def xor_encrypt(text, key)
  text.bytes.map { |b| (b ^ key).chr }.join
end

encrypted = xor_encrypt("hello", 42)
decrypted = xor_encrypt(encrypted, 42)

六、按位取反(~) #

6.1 基本用法 #

ruby
~5
~0b101
(~5).to_s(2)

6.2 运算规则 #

text
~101 (5) = ...11111010 (-6)

6.3 应用场景 #

ruby
def clear_bit(n, bit)
  n & ~(1 << bit)
end

clear_bit(0b1110, 1).to_s(2)

def ones_complement(n)
  ~n & ((1 << n.bit_length) - 1)
end

ones_complement(5).to_s(2)

七、左移(<<) #

7.1 基本用法 #

ruby
5 << 1
5 << 2
0b101 << 1
(5 << 1).to_s(2)

7.2 运算规则 #

text
101 (5) << 1 = 1010 (10)
101 (5) << 2 = 10100 (20)

7.3 应用场景 #

ruby
def multiply_by_power_of_2(n, power)
  n << power
end

multiply_by_power_of_2(5, 2)

def create_mask(bits)
  (1 << bits) - 1
end

create_mask(4).to_s(2)

八、右移(>>) #

8.1 基本用法 #

ruby
20 >> 1
20 >> 2
0b10100 >> 1
(20 >> 1).to_s(2)

8.2 运算规则 #

text
10100 (20) >> 1 = 1010 (10)
10100 (20) >> 2 = 101 (5)

8.3 应用场景 #

ruby
def divide_by_power_of_2(n, power)
  n >> power
end

divide_by_power_of_2(20, 2)

def extract_bits(n, start, length)
  (n >> start) & ((1 << length) - 1)
end

extract_bits(0b11010110, 2, 4).to_s(2)

九、位掩码应用 #

9.1 权限系统 #

ruby
class Permission
  READ = 0b0001
  WRITE = 0b0010
  EXECUTE = 0b0100
  ADMIN = 0b1000

  def initialize
    @flags = 0
  end

  def grant(permission)
    @flags |= permission
  end

  def revoke(permission)
    @flags &= ~permission
  end

  def has?(permission)
    (@flags & permission) != 0
  end

  def toggle(permission)
    @flags ^= permission
  end

  def to_s
    @flags.to_s(2).rjust(4, '0')
  end
end

perm = Permission.new
perm.grant(Permission::READ)
perm.grant(Permission::WRITE)
perm.has?(Permission::READ)
perm.has?(Permission::EXECUTE)
perm.revoke(Permission::WRITE)
perm.has?(Permission::WRITE)

9.2 颜色处理 #

ruby
def rgb_to_hex(r, g, b)
  (r << 16) | (g << 8) | b
end

def hex_to_rgb(hex)
  r = (hex >> 16) & 0xff
  g = (hex >> 8) & 0xff
  b = hex & 0xff
  [r, g, b]
end

hex = rgb_to_hex(255, 128, 64)
hex.to_s(16)
hex_to_rgb(hex)

9.3 标志位 #

ruby
class Flags
  FLAG_A = 0b0001
  FLAG_B = 0b0010
  FLAG_C = 0b0100
  FLAG_D = 0b1000

  def initialize
    @flags = 0
  end

  def set(*flags)
    flags.each { |f| @flags |= f }
  end

  def clear(*flags)
    flags.each { |f| @flags &= ~f }
  end

  def set?(flag)
    (@flags & flag) != 0
  end

  def toggle(flag)
    @flags ^= flag
  end

  def to_a
    [FLAG_A, FLAG_B, FLAG_C, FLAG_D].select { |f| set?(f) }
  end
end

十、实用示例 #

10.1 判断奇偶 #

ruby
def even?(n)
  n & 1 == 0
end

def odd?(n)
  n & 1 == 1
end

even?(4)
odd?(5)

10.2 交换变量 #

ruby
def xor_swap(a, b)
  a ^= b
  b ^= a
  a ^= b
  [a, b]
end

xor_swap(10, 20)

10.3 计算位数 #

ruby
def count_bits(n)
  count = 0
  while n > 0
    count += n & 1
    n >>= 1
  end
  count
end

count_bits(7)
count_bits(8)

def count_bits_builtin(n)
  n.to_s(2).count('1')
end

10.4 判断2的幂 #

ruby
def power_of_two?(n)
  n > 0 && (n & (n - 1)) == 0
end

power_of_two?(8)
power_of_two?(6)
power_of_two?(16)

10.5 获取最高位 #

ruby
def highest_bit(n)
  return 0 if n == 0
  1 << (n.bit_length - 1)
end

highest_bit(18).to_s(2)
highest_bit(32).to_s(2)

十一、总结 #

本章我们学习了:

  1. 二进制基础:二进制、十六进制表示和转换
  2. 按位与:&、掩码、提取位
  3. 按位或:|、设置位、组合标志
  4. 按位异或:^、切换位、加密
  5. 按位取反:~、清除位
  6. 移位运算:<<、>>、乘除2的幂
  7. 位掩码应用:权限系统、颜色处理

接下来让我们学习Ruby的赋值运算符!

最后更新:2026-03-27