以下伪代码和 JavaScript 代码是算法实现的摘录,我想将其转换为 C++。
伪代码:
for b from 0 to 2|R| do
for i from 0 to |R| do
if BIT-AT(b, i) = 1 then // b’s bit at index i
JavaScript 代码:
for (var b = 0; b < Math.pow(2, orders[r].length); b++) // use b's bits for directions
{
for (var i = 0; i < orders[r].length; i++)
{
if (((b >> i) & 1) == 1) { // is b's bit at index i on?
我不明白这段代码的最后一行发生了什么,上面给出的 JavaScript 代码的 C++ 代码应该是什么。到目前为止我写的是:
for (int b = 0; b < pow(2, orders.at(r).size()); b++)
{
for (int i = 0; i < orders.at(r).size(); i++)
{
if (((b >> i) & 1) == 1)***//This line is not doing what it is supposed to do according to pseudo code***
最后一行给我 segmentation fault 。
-- 编辑:我很抱歉问题出在其他地方,这段代码工作正常。
最佳答案
(((b >> i) & 1) == 1)
| |
| |
| bitwise AND between the result of the shift and number 1.
|
shift b by i bits to the right
然后将结果与数字 1 进行比较。
因此,例如,如果 b
是 8,而 i
是 2,它将执行以下操作:
- 将 8(即
00001000
)向右移动 2 位。结果将为00000100
。 - 应用按位与:
00000100 BITWISE_AND 00000001
,结果将为0
。 - 将它与 1 进行比较。由于
0 =/= 1
,您将不会输入最后一个if
。
至于这背后的逻辑,代码 ((b >> i) & 1) == 1)
返回 true
如果位数 i
为 b
变量的 1
,否则为 false
。
我相信 c++ 代码会是一样的,除了我们在 c++ 中没有 Math
类,你必须替换 var
s 具有相应的类型。
关于c++ - JavaScript 位操作到 C++ 位操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11948166/