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)
十一、总结 #
本章我们学习了:
- 二进制基础:二进制、十六进制表示和转换
- 按位与:&、掩码、提取位
- 按位或:|、设置位、组合标志
- 按位异或:^、切换位、加密
- 按位取反:~、清除位
- 移位运算:<<、>>、乘除2的幂
- 位掩码应用:权限系统、颜色处理
接下来让我们学习Ruby的赋值运算符!
最后更新:2026-03-27