2007年10月9日火曜日

論理和とビットシフトで掛け算する

ビットシフトを使った掛け算。CASL2などを学んだ方なら動作原理はご存知かと思います。
前回の加算モジュールを利用しています。

関連:http://blog.livedoor.jp/dankogai/archives/50638838.html

#module
#defcfunc add int left_op, int right_op, local left, local right, local tmp
    left = left_op : right = right_op
    while ( left & right )
        tmp = ( left & right ) << 1
        left ^= right
        right = tmp
    wend
    return ( left | right )
#defcfunc multi int left_op, int right_op, local left, local right, local tmp
    left = left_op : right = right_op
    while ( right )
        if ( right & 1 ) : tmp = add( tmp, left )
        left <<= 1
        right >>= 1
    wend
    return tmp
#global
    randomize
    repeat 10
        l = rnd9 ) + 1
        r = rnd9 ) + 1
        mes strf"%1d", l ) + " * " + strf"%1d", r ) + " = " + strf"%2d"multi( l, r ) )
    loop
    stop

2 件のコメント:

  1. こんばんわellerさん
    ”りすと”ことre:no.44です
    HNは色々考えたあげく
    y.tackにしようかな。と考えているのですが
    これのHNの変え方がわからない...

    それにしてもこのスクリプト
    技術に疎い僕でも
    あーあれかぁと思って嬉しくなってしまいました
    それでは、更新楽しみにしています

    返信削除
  2. コメントありがとうございます。長くて複雑なものが最近多かったので、短いスクリプトをあげてみました。
    結構良いスパイスになったのではないかと思います。

    返信削除