0

以下伪和 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*** 

最后一行是给我分段错误。

- 编辑:我很抱歉问题出在其他地方,此代码工作正常。

4

2 回答 2

1
(((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,它将执行以下操作:

  1. 将 8(即00001000)向右移动 2 位。结果将是00000100
  2. 应用按位 AND: 00000100 BITWISE_AND 00000001,结果将是0
  3. 将其与 1 进行比较。因为0 =/= 1,您不会输入最后一个if

至于这背后的逻辑,如果变量的位数是,代码((b >> i) & 1) == 1)返回,否则。trueib1false

而且我相信c++代码会是一样的,除了我们在c++中没有Math类,你必须var用相应的类型替换s。

于 2012-08-14T08:10:31.453 回答
1

>>是右移运算符,即取左操作数并将其位 n 位置向右移动(由右操作数定义)。

所以本质上,1 << 51移至100000.

在您的示例(b >> i) & 1 == 1中,将检查是否由于逻辑和 ( ) 而设置了第 i 位 (1 &)。

至于您的代码,您可以(几乎)直接在 C 或 C++ 中使用它。Math.pow()会变成pow()inside math.h,但是(在这种情况下)您可以简单地使用左移运算符:

for (int b = 0; b < (1 << orders[r].length); ++b) // added the brackets to make it easier to read
    for (int i = 0; i < orders[r].length; ++i)
        if (((b >> i) & 1) == 1) {
            // ...
        }

1 << orders[r].length本质上与 相同pow(2, orders[r].length),但没有任何函数调用。

于 2012-08-14T08:14:32.637 回答