ruby 编程中的位运算符
Bitwise operators in ruby programming
位运算符很难理解。有人可以详细解释下面的 ruby 代码吗?
def res(n)
~(~1<<((2*n)>>1))
end
res(5) --> 63
首先,让我们了解一下运算符的优先级:
# 5 3 4 1 2
~(~1<<((2*n)>>1))
2*n
乘以 n
乘以 2
>>1
将结果除以2
使得这两个操作完全多余,原码100%等于~(~1<<n)
~1
是bitwise complement,对于0b01
是-0b10
,也就是-2
,
base<<power
是两倍的幂,因此我们有 -2^(5+1) = -64
- 按位补码再次从
-0b1000000
中产生 0b0111111
。
更新编辑。
让我们尽可能详细地描述正在发生的事情以及它们在这里的顺序。
首先让我相信第一个关于原件冗余的答案
表达。我从简单的开始。
def bitwise_complement_bits(args)
~ args
end
def bitwise_shift_left(o, n)
o << n
end
a = bitwise_complement_bits(1)
b = bitwise_shift_left(a, 5)
p bitwise_complement_bits(b)
更新编辑:
Here's a nifty site for some quick evaluation of code.
我只是粘贴了我们这里的内容。您可以在那里通过它,真正看到发生了什么。
或者您可以使用自己的安装以及 repl.it https://repl.it/languages/ruby
玩得开心!
位运算符很难理解。有人可以详细解释下面的 ruby 代码吗?
def res(n)
~(~1<<((2*n)>>1))
end
res(5) --> 63
首先,让我们了解一下运算符的优先级:
# 5 3 4 1 2
~(~1<<((2*n)>>1))
2*n
乘以n
乘以2
>>1
将结果除以2
使得这两个操作完全多余,原码100%等于~(~1<<n)
~1
是bitwise complement,对于0b01
是-0b10
,也就是-2
,base<<power
是两倍的幂,因此我们有-2^(5+1) = -64
- 按位补码再次从
-0b1000000
中产生0b0111111
。
更新编辑。
让我们尽可能详细地描述正在发生的事情以及它们在这里的顺序。 首先让我相信第一个关于原件冗余的答案 表达。我从简单的开始。
def bitwise_complement_bits(args)
~ args
end
def bitwise_shift_left(o, n)
o << n
end
a = bitwise_complement_bits(1)
b = bitwise_shift_left(a, 5)
p bitwise_complement_bits(b)
更新编辑:
Here's a nifty site for some quick evaluation of code.
我只是粘贴了我们这里的内容。您可以在那里通过它,真正看到发生了什么。
或者您可以使用自己的安装以及 repl.it https://repl.it/languages/ruby 玩得开心!