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


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
0831
ビット数値のある1ビットに0か1を書き込みたい8未解決


ビット

リンク

2006/8/31(Thu) 21:16:26|NO.2201

数値のある1ビットに0か1を書き込みたいのです。

たとえば、23の6ビット目に0を書き込むと、

00010111

00010101

などしたいのですが、うまくできません。どうすればいいでしょうか。



この記事に返信する


Irisawa

リンク

2006/9/1(Fri) 00:41:15|NO.2203

0b00010111(23)を0b00010101(21)にしたいなら0b00010111に0b11111101(253)をAndしては
どうでしょうか。


; ↓計算結果 ; 0b00010111 ; &0b11111101 ; ----------- ; 0b00010101 a = 0b00010111 ; 0b00010111 = 23 = 0x17 b = 0b11111101 ; 0b11111101 = 253 = 0xfd c = 0b00010101 ; 0b00010101 = 21 = 0x15 a &= b ; 0b00010111 & 0b11111101 = 0b00010101 mes a mes c stop



GENKI

リンク

2006/9/1(Fri) 00:48:23|NO.2204

> どうすればいいでしょうか。

 どんなことをやってみたのかを書いてもらえるともっと適切なコメントができると思います。
とりあえず出来うる回答をしておきます。

 まずはビット操作について調べてみてください。
とりあえずこれをどうぞ(過去ログにも似たような質問あったような…)
つ http://hspwiki.nm.land.to/?%BE%AE%A5%EF%A5%B6%2F%A5%D3%A5%C3%A5%C8%C1%E0%BA%EE#o21c971e

補足説明
 A:変換元
 B:変更するビットの指定
としたとき、
 1→0:A and B xor A
 0→1:A or B



> 00010111
> ↓
> 00010101

2ビット目が変わっているようなのですが。



Irisawa

リンク

2006/9/1(Fri) 00:49:53|NO.2205

より正確には全bitの内、0にしたいビット以外はすべて1にする必要があります。
32bitなら32bitの内31bitをすべて1にしてください。


; 0b11111111111111111111111111111101 = 0xfffffffd = -3 = 4294967293 a = 0b00010111 & 0b11111111111111111111111111111101 mes a stop



ビット

リンク

2006/9/1(Fri) 17:23:11|NO.2221

こういう命令を作ってみたのですが、うまくいきませんでした。

#deffunc test var varA,int intA,int intB,int intC,local locA ;varAは書き込む変数 ;intAはバッファのインデックス(Byte単位) ;intBは何バイト目に書き込むか      ;intCは書き込む数値(0か1) ;エラーがあるとstatに-1が変える if intA<0:return -1 if intB<0:return -1 if intB>7:return -1 if intC>2:return -1 if intC<0:return -1 locA = peek(varA,intA) if intC{ locA = locA | (1 << intB) }else{ locA &= $FF ^ ( 1 << intB) } poke varA,intA,locA return



KIMU

リンク

2006/9/1(Fri) 21:48:21|NO.2231

>こういう命令を作ってみたのですが、うまくいきませんでした。
どんなふうに、うまく行かないの?
動作は正しく行ってるようだけど・・・


> ;varAは書き込む変数
> ;intAはバッファのインデックス(Byte単位)
varは要素無しの変数しか扱えない
intAの上限エラー処理をしてない所を見ると配列変数を使うのかな?
それなら arrayを使う

>     ;intCは書き込む数値(0か1)
全角スペースが使われてる(これはコンパイル時にエラーが出るから違うか)

ビットさんが、どう動くのを期待して作ってるか分からないから
これ以上は分からん(最初に書かれてる目的は出来てるし)



GENKI

リンク

2006/9/1(Fri) 22:10:25|NO.2232

そのまま使うとこの行↓で全角スペースが使われてるって怒られますね。
;intCは書き込む数値(0か1)

あとは大丈夫っぽいです。
#module
#deffunc test var varA,int intA,int intB,int intC,local locA
         ;varAは書き込む変数
         ;intAはバッファのインデックス(Byte単位)
         ;intBは何バイト目に書き込むか
         ;intCは書き込む数値(0か1)
         ;エラーがあるとstatに-1が変える
	if intA<0:return -1
	if intB<0:return -1
	if intB>7:return -1
	if intC>2:return -1
	if intC<0:return -1
	locA = peek(varA,intA)
	if intC{
		locA = locA | (1 << intB)
	}else{
		locA &= $FF ^ ( 1 << intB)
	}
	poke varA,intA,locA
	return

#deffunc bitdisp int,int
	mref bits,0
	mref w,1
	if (w<1)|(w>32) : w=32
	s=""
	repeat w
		if bits&(1<<cnt) : s="1"+s : else : s="0"+s
	loop
	mes "0b"+s
	return
#global

;テスト
ans = 0b00011111
bitdisp ans,8	;表示
mes "  76543210"
test ans, 0,6,1
test ans, 0,1,0
bitdisp ans,8	;表示

mes "--------"
dim atai,8
atai(0) = 0,0,0,0,0,0,0,0,0,0
repeat 8
	test atai,4*cnt,cnt,1
loop
repeat 8
bitdisp atai(cnt),8	;表示
loop

stop



KIMU

リンク

2006/9/1(Fri) 23:40:15|NO.2233

ビットさん・・・
今まで立てた質問スレ全部立てっぱなしですね・・・



GENKI

リンク

2006/9/2(Sat) 01:10:39|NO.2234

> 今まで立てた質問スレ全部立てっぱなしですね・・・

ほんとですね。
…と確認していたら発見。

> とりあえずこれをどうぞ(過去ログにも似たような質問あったような…)

ぬ!不覚(^ ^;
http://hsp.tv/play/pforum.php?mode=all&num=1859



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