JavaScript位操作到C ++位操作

时间:2012-08-14 08:04:48

标签: c++ bitwise-operators

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

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

- 编辑:我道歉问题是在其他地方,这段代码工作正常。

2 个答案:

答案 0 :(得分: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
  4. 至于此背后的逻辑,如果((b >> i) & 1) == 1)变量的位数truei,则代码b会返回1false 1}}否则。

    我相信c ++代码是相同的,除了我们在c ++中没有Math类,你必须用相应的类型替换var

答案 1 :(得分:1)

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

基本上,1 << 5会将1移至100000

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

至于你的代码,你可以(几乎)直接在C或C ++中使用它。 Math.pow()会在pow()内成为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)相同,但没有任何函数调用。