HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0308
ESCyちょっとしたビット演算について5未解決


ESCy

リンク

2009/3/8(Sun) 00:02:17|NO.23758

例えば$400000という16進数表記の数値は「1ビット目を0として」数えた場合、
「22ビット目が立っている」と表現出来ますよね。これを22という10進数の数値として表したいのです。

この変換が自力で解けず、悩まされています…
HSPの各命令(repeat等)を使わず4バイトの数値として基本的な計算式、
つまり数値と演算子のみの計算式を教えて頂けないでしょうか?



この記事に返信する


faergare

リンク

2009/3/8(Sun) 01:48:42|NO.23759

>HSPの各命令(repeat等)を使わず4バイトの数値として基本的な計算式
0ビット目、1ビット目、・・・22ビット目を得たい、
すなわち、

1=2^0・・・0ビット目が立ってる
2=2^1・・・1ビット目が立ってる
4=2^2・・・2ビット目が立ってる
・・・
2^a=Xとしたとき、
a=log2 X
とあらわす。
log2 Xを解けば○ビット目が立っているかがわかる。
ただしHSPには2を底とする対数関数がないため、
対数の底の変換公式を用いる。
すると、
log2 X=log10 X/log10 2
と表せる。
log10は常用対数といい、HSPには常用対数関数logfがある。
log10 X = logf(X)
である。


#module #defcfunc onbit int i return logf(i)/logf(2) // 対数の底の変換公式(数学) #global mes onbit(1) mes onbit(2) mes onbit(3) // onbitが2つあるから変な数字になるのは当然 mes onbit($400000)

ただし、この方法はオンビットが1つの場合にしか使えないのは、上記の説明でわかるだろう。
よって、オンビットがいくつあって、「どこ」と「どこ」が立っているのかを得たいなら、
HSPの各命令(repeat等)を使わざるを得ない。



faergare

リンク

2009/3/8(Sun) 01:57:25|NO.23760

>つまり数値と演算子のみの計算式を教えて頂けないでしょうか?
ごめん。ここ読んでなかった。
つまり上の場合だと、logf(x)の計算を知りたいってことですね。わかりません。

どっかの上級者の四則演算とビットシフトを駆使してsinやcosを求めるプログラムでも見たんでしょうが、
凡人にはわかりませんわ。

凡人は用意された関数を使えばいい。



KA

リンク

2009/3/8(Sun) 04:38:03|NO.23761

>>「22ビット目が立っている」これを22という10進数の数値として表したい。

 複数ビットが立っているときはどうするの?

 取り合えず、32ビット中で1個だけ立っているとして、整数値が X とすると。

X=2^22 と成り、変形すると log2,X=22 になります。(底が2)
 さらに logX/log2=22 と変形できます。(底は何でも良い)
 ※詳しくは、その方面を参照してください。

 スクリプトでは
 1:値を実数にする
 2: logX/log2 を計算
 3:答えを四捨五入して整数に

 と成ります、複数ビットでは使えないでしょう。

 複数ビットでは
 1:偶数奇数の判断( / \ )をして、奇数ならビットが立っている。
 2:2で割るか '>>' (シフト)させる。
 3:1〜2を、31回?繰り返す。
 しか無いと思います。



ANTARES

リンク

2009/3/8(Sun) 06:51:12|NO.23763

 本題はほかの人が答えているので、派生課題を。

mes "16進数8桁以下" string="" input string button "go", *l_go stop *l_go color 255,255,255 boxf 0,66,639,479 color data=int("$"+string) mask=1 repeat 32 ;if data & mask: mes ""+cnt+" data=$"+strf("%8X",data)+" mask=$"+strf("%8X", mask) if data & mask: mes cnt mask=mask<<1 loop stop



KA

リンク

2009/3/8(Sun) 10:02:53|NO.23764

 手違いで同じ様な事を書いてしまった、悔しいので補足。

>>log10は常用対数といい、HSPには常用対数関数logfがある。
logf() は、自然対数です。



ONION software Copyright 1997-2018(c) All rights reserved.