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 件のコメント:

y.tack さんのコメント...

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

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

eller さんのコメント...

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