• ベストアンサー

下記の動作をなるべく少ない論理演算でやりたい

入力(0か1)はabcdefthの8つで、1の場所を右にソートして入力と同じ形で出力したいんです 論理演算はNOT、AND、OR、XORしか使えず新しい変数は1bitのみしか使えません abcdefth 00000000 → 00000000 00000010 → 00000001 00001010 → 00000011 01100111 → 00011111 11111110 → 01111111 できれば40回未満程度でやりたいのですが、うまい方法は無いでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

まず確認なのですが ・ 論理演算は a AND b のように a~h (+新規t) を変数として1bitずつ行うものですか? ・演算結果を入れる場所は? a ← a AND b のように、演算に使用した変数に結果を代入することは可能ですか? ・制御構造(IF, GOTO等)は無いのですね? 上記の条件だとすると ab 2bitのソートを考えると 入力|出力 ab|ab 00|00 01|01 10|01 11|11 で 出力a = a AND b 出力b= a OR b a= a AND b で aが破壊されてしまうので、別変数tに退避させると t=a a= a AND b b = t OR b となります。 この一連の動きを SORT2(a,b) とすると、 abcの並び変えは SORT2(a,b) SORT2(b,c) SORT2(a,b) となります。バブルソートのアルゴリズムです。 他のアルゴリズムだと状態の記憶やフローの制御が必要になってくるので、無理あるいは非効率だと思われます。

at_key
質問者

お礼

すみません! まだ不十分でした。abcdefghの内容でIFは出来ません それと、abcdefghが関われない変数ならint型でもなんでも作れて普通に演算、分岐が可能でした ややこしいですね・・すみません。 ヒントを頂けたので自分で頑張ってみます。 ありがとうございました

at_key
質問者

補足

すみません。IF、GOTOは可能でした。 他はおっしゃるとおりです。 するとその方法の8桁は28*3で論理演算84回でしょうか ううん、もっと直接的な方法はありませんでしょうか?

関連するQ&A

専門家に質問してみよう