コミュニティアイコン プチコン 非公式コミュニティ トピック

アバター
MIKE猫Soft ◆WlLT6KG2mCMu
2018/6/30 16:42
情報交換
このソースコードを短く、高速化してください。
'ビットを抽出したいとき ""に、BITと書いて、LEBE%に、抽出したい桁(1〜29)を入力(BIT桁)
'1バイトを抽出したい場合、""にCHARと書く。(出力は、B1%〜B4%に、1バイトずつ。)
'2バイトなら"SHORT"に、LEBE%に、1〜2の範囲で。
COMMON DEF DAT_EXT DAT%,TYPE$,LEBE% OUT B1%,B2%,B3%,B4%
B1%=0:B2%=0:B3%=0:B4%=0
IF TYPE$ == "BIT" THEN
ST$=BIN$(DAT%)
'この場合MID$の文字位置が0から始まるのでこうなる。
B1%=VAL(RIGHT$(ST$,LEBE%-1,1))
B2%=VAL(RIGHT$(ST$,LEBE%,1))
B3%=VAL(RIGHT$(ST$,LEBE%+1,1))
B4%=VAL(RIGHT$(ST$,LEBE%+2,1))
ELSE
RGBREAD DAT% OUT B1%,B2%,B3%,B4%
ENDIF
IF TYPE$ == "CHAR" THEN
SWAP B1%,B4%
SWAP B2%,B3%
ELSEIF TYPE$ == "SHORT" THEN
B1%=B1%*&H100+B2%
B3%=B1%*&H100+B4%
ENDIF
END
お願いします。

コメント

アバター
こういち 2018/6/30 17:06 ◆ou0jbJnEJ0Kb
'文字列使うの面倒で遅いのでBIT,CHAR,SHORTを0,1,2に変える
'引数の%や#,$,[]は意味を為さないので省略
COMMON DEF DAT_EXT DAT,TYPE,LEBE OUT B1,B2,B3,B4
 ON TYPE GoTO @BIT,@CHAR,@SHORT
 @BIT
  B1=DAT AND 1<<LEBE-1
  B2=DAT AND 1<<LEBE
  B3=DAT AND 1<<LEBE+1
  B4=DAT AND 1<<LEBE+2
  RETURN '読みやすさなんて知らない
 @CHAR
  'SWAP面倒で遅いのでダイレクトに
  'RGBREAD B4,B3,B2,B1でも可
  B1=BIT AND 255
  B2=(BIT AND 255<<8)>>8
  B3=(BIT AND 255<<16)>>16
  B4=(BIT AND 255<<24)>>24
  RETURN
 @SHORT
  'B*&H100よりB<<8方が遥かに速い
  'こちらもダイレクトに
  B1=DAT AND &HFFFF<<16
  B2=(DAT AND 255<<16)>>16
  B3=DAT AND &HFFFF
  B4=DAT AND 255
END
'よく見たらそこまで短くなってない
アバター
MIKE猫Soft 2018/6/30 17:13 ◆WlLT6KG2mCMu
訂正
ELSEIF TYPE$ == "SHORT" THEN
B1%=B1%*&H100+B2%
B3%=B1%*&H100+B4%
ENDIF
ではなく、
ELSEIF TYPE$ == "SHORT" THEN
B1%=B1%*&H100+B2%
B3%=B3%*&H100+B4%
でした。すみません。
アバター
MIKE猫Soft 2018/6/30 17:58 ◆WlLT6KG2mCMu
すみません。こういちさん。
   B1=DAT AND &HFFFF<<16
ここ→B2=(DAT AND 255<<16)>>16
   B3=DAT AND &HFFFF
   B4=DAT AND 255
についてなんですけども、負の数も使うので、算術シフトしてしまうんですよ。そうならないようにしていただきたいのです。お願いします。
事故現場
http://petitverse.hosiken.jp/community/petitcom/topic/?read=445&ukey=0
アバター
しんいち 2018/6/30 18:33 ◆lHy.hAWXbthn
整数型32bitを1バイトずつ分割する場合、シフトしてからANDした方が良いでしょう。
B1=DAT AND 255
B2=DAT>>8 AND 255
B3=DAT>>16 AND 255
B4=DAT>>24 AND 255
じゃないと、B4が算術シフトの罠にかかってしまいます。

配列、ループ使うとこんな感じに。
DIM B%[4]
I=0:REPEAT B%[I]=DAT AND 255:DAT=DAT>>8:I=I+1:UNTIL I>3
B1=B%[0]:B2=B%[1]:B3=B%[2]:B4=B%[3]
但し配列使ってるので遅いはず。
アバター
MIKE猫Soft 2018/6/30 19:32 ◆WlLT6KG2mCMu
事故が発生したので、別のトピックで、書きたいと思います。
アバター
こういち 2018/6/30 19:43 ◆ou0jbJnEJ0Kb
となるとこうですかね?
COMMON DEF DAT_EXT DAT,TYPE,LEBE OUT B1,B2,B3,B4
 ON TYPE GoTO @BIT,@CHAR,@SHORT
 @BIT
  B1=DAT>>LEBE-1 AND 1
  B2=DAT>>LEBE AND 1
  B3=DAT>>LEBE+1 AND 1
  B4=DAT>>LEBE+2 AND 1
  RETURN
 @CHAR
  RGBREAD B4,B3,B2,B1
  IF TYPE==1 THEN RETURN
 @SHORT
  VAR TMP=B4<<8+B3
  B3=B2<<8+B1
  B1=TMP
END

コメントを書く

  • こちらは「プチコン3号」「プチコンBIG」など、プチコンシリーズに関する話題を扱ったコミュニティです
  • プチコンシリーズにまったく関係ない書き込みはご遠慮下さい。削除の対象となります
  • こちらにはその他のゲームや雑談のコミュニティはなく、作る予定もありません (ひとりで管理できないため)。ごめんなさい
  • ユーザー登録なしで書き込みができます
  • 秘密の合い言葉は成りすましの防止 (トリップ機能)、書き込みの編集時の本人認証に使用します
  • 秘密の合い言葉に他人に推測されやすい言葉、他サービスと同じパスワードは入力しないでください。
  • 書き込むと、投稿時に入力したお名前と秘密の暗号が記憶され、ログイン状態になります

- WEB PATIO -