• 締切済み

CASL1

CASL1の問題でわからないものがありました。お手伝いいただけると助かります。問題に解説も載っていたので一緒に載せておきます。きっとそれほど難しくない問題なのでしょうが、CASLになれない為参考書を読んでもよく理解できません。。 10進入力と数字コード 入力 1~4個の10進数字の列。 出力 入力を正の10進数とみなしたときの2進表現。但し、有効数字のみを出力すること。 例:入力 2006[Enter] 出力 11111010110(メモリーの16ビット表現をそのまま出力した 0000011111010110は不可) 解説: (1)CASLの入出力はメモリー上の連続する領域(入出力バッファ)に文字データとして置かれた内容をINマクロ、OUT マクロでバッファの名前(先頭番地に付けたラベル)、バッファの長さを指定して行う。 (2)文字列を10進数として処理するためには、各文字が意味として0~9の数値をもつこと、各桁が10の冪乗の重みをもつことを理解する必要がある。前者では文字データから数値への変換(文字0~9に対するJIS の文字コードは連続しているので文字0に対するデータを引けば数値になる)し、後者では(それまでに処理した)上位桁の数値を10倍して次の新しい桁の数値を加えればよい。CASLには乗算の命令はないので2倍したもの(左1ビットシフト)と8倍(更に左2ビットシフト)したものとを加えればよい。 (3)数値を2進数字の列として求めるには1ビットずつ処理してシフトすればよい。例えば、1とAND を取ると最下位ビットが抽出される。

みんなの回答

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

えーと後半の解説でほとんど答えになっているのですが具体的にどの辺りがわからないのでしょうか? 入出力はお約束なので省略するとして、 '2006'という文字列を数値に変換するには、 1. レジスタ1に文字列の先頭番地を格納 2. レジスタ2に桁数を格納 3 レジスタ3にゼロを格納 3. レジスタ4にレジスタ1が指す番地の内容を格納 4. レジスタ4の内容から '0' (文字'0'の文字コードの値)を引く 5. レジスタ4とレジスタ3の値を足し、レジスタ3に格納 6. レジスタ2から1を引く 7. レジスタ2がゼロになったら終了 8. レジスタ1に1加える 9. レジスタ3を10倍する 10. 3へ移行する てな感じになると思います。実際にはレジスタが足りなくなるはずなので メモリ上にワークエリアを取って行うことになるでしょう。 答えはレジスタ3にはいります。 求まった数値を2進文字列に変換するには、 レジスタ1に変換対象の数値が入っているとして 1. レジスタ2に結果を収める領域の先頭番地を格納 2. レジスタ1と 0b1000_0000_0000_000 とのand演算を行い、 結果がゼロならレジスタ2の指す番地に'0'を格納 ゼロ以外ならレジスタ2の指す番地に'1'を格納 3. レジスタ1を1ビット左にシフトする 4. レジスタ2に1加える 2.から4.を16ビット分繰り返せば2進文字列に変換されます。 ただし、これでは問題の求めるように上位の余計なゼロを 抑制するということができていないので、その辺工夫する 必要があります。どうすればよいかはちょっと考えてみてください。 希望があればヒントは出します。

関連するQ&A