HIWORD等で使われている割り算・掛け算

ActiveBasicのバグと思われる不具合を発見された方は、こちらから知らせていただけると助かります。
返信する
メッセージ
作成者
Sinryow
記事: 141
登録日時: 2005年5月31日(火) 09:34
お住まい: 北海道
連絡する:

HIWORD等で使われている割り算・掛け算

#1 投稿記事 by Sinryow »

function.sbpではHIWORD, HIBYTE, MAKELONG, MAKEWORDでは割り算・掛け算が使われていますが,これをビットシフトにすれば高速化できると思います。
あと,これらは簡単な内容なのでConst定義にしてもよいかと思います。
' ============================================================
' Sinryow Game Home Page - http://www.sinryow.net/
' Sinryow ActiveBasic Center - http://ab.sinryow.net/
' ============================================================
山本
Site Admin
記事: 535
登録日時: 2005年5月30日(月) 15:08
連絡する:

#2 投稿記事 by 山本 »

そうですね。Const定義にしたほうが処理速度が速くなるので、早速次回のバージョンアップで改良しようと思います。

因みに、修正後のコードは下のようなものになります(function.sbpの一部分)。

コード: 全て選択

Const HIBYTE(w) = (w >> 8) and &HFF
Const LOBYTE(w) = w and &HFF
Const HIWORD(dw) = (dw >> 16) and &HFFFF
Const LOWORD(dw) = dw and &HFFFF

Const MAKEWORD(a,b) = (a and &HFF) or ((b and &HFF)<<8)
Const MAKELONG(a,b) = (a and &HFFFF) or ((b and &HFFFF)<<16)
xsb007

マクロ関数の()について

#3 投稿記事 by xsb007 »

Constによるマクロ関数は、()でくくらないとまずいんじゃないかと。
実際、これで #defineと同様の問題が起こっています。
または BASIC なんだから、自動で()をつけて文字列の置き換えを行うか。

コード: 全て選択

Const HIBYTE(w) = ( ( (w) >> 8) and &HFF )
Const LOBYTE(w) = ( (w) and &HFF)
Const HIWORD(dw) = ( ( (dw) >> 16) and &HFFFF)
Const LOWORD(dw) = ( (dw) and &HFFFF )

Const MAKEWORD(a,b) = ( ((a) and &HFF) or (((b) and &HFF)<<8) )
Const MAKELONG(a,b) = ( ((a) and &HFFFF) or (((b) and &HFFFF)<<16) )
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

Re: マクロ関数の()について

#4 投稿記事 by イグトランス »

> 実際、これで #defineと同様の問題が起こっています。
ABのConst関数はC++のinline関数のようなものなので問題ないと思います。
xsb007

#5 投稿記事 by xsb007 »

ver. 4.01.02において、以下のコードを実行してみると、確かに、#define同等の結果となります。ご確認ください。

コード: 全て選択


#N88BASIC

Const abc(x) = x * (x-1) * 50
Const xyz(x) = x * 50


print abc(2+1)  'x * (x-1) * 50 : 2+1 * (2+1-1) * 50
                               '= 2+ (2+1-1) * 50
                               '= 2+ 2 * 50
                               '= 102 となってしまいます。
                               ' ご確認ください。

print abc(3)    'x * (x-1) * 50 : 3 * (3-1) * 50
                               '= 3 * 2 * 50
                               '= 300


print

print xyz(4)    ' x * 50 : 4 * 50
                        '= 200
                        
print xyz(3+1)  ' 3+1 * 50 : 3 + 50
                          '= 53
返信する