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. 000010008(これは)を2ビット右にシフトします。結果はになります00000100
  2. ビット単位のAND:を適用する00000100 BITWISE_AND 00000001と、結果はになります0
  3. 1と比較してください。なので0 =/= 1、最後のは入力しませんif

この背後にあるロジックについては、変数のビット番号がである場合はコード((b >> i) & 1) == 1)が返され、そうでない場合はコードが返されます。trueib1false

また、c ++にはクラスがないことを除いて、c ++コードは同じであり、sを対応する型Mathに置き換える必要があると思います。var

于 2012-08-14T08:10:31.453 に答える
1

>>は右シフト演算子です。つまり、左のオペランドを取り、そのビットnの位置を右に移動します(右のオペランドで定義されます)。

したがって、基本的に1 << 5はに移動1100000ます。

あなたの例(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)ですが、関数呼び出しはありません。

于 2012-08-14T08:14:32.637 に答える