以下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***
最后一行是给我分段错误。
- 编辑:我道歉问题是在其他地方,这段代码工作正常。
答案 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,则会执行以下操作:
00001000
)2位。结果将是00000100
。 00000100 BITWISE_AND 00000001
,结果为0
。 0 =/= 1
进行比较,您不会输入最后一个if
。 至于此背后的逻辑,如果((b >> i) & 1) == 1)
变量的位数true
为i
,则代码b
会返回1
,false
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)
相同,但没有任何函数调用。