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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0623
js2hspHSPで0埋め右シフトを行いたい6解決


js2hsp

リンク

2020/6/23(Tue) 22:25:52|NO.90851

JavaScriptでは「>>>」で簡単に処理を行えますが、
HSPではそういった演算子はありません。
どういう処理を行えばよろしいでしょうか?



この記事に返信する


あらや

リンク

2020/6/23(Tue) 23:06:19|NO.90852

単純に言うと、右に10ビットシフトする場合
上位9ビットを0にすれば良いのですが、
それが簡単に見えて意外と難しい……ように見えて、
実はそのまま簡単です。

排他的論理和を利用してモジュールを作ってみました。

#module // 0埋めで右へビットシフト(数値p01を0埋めで右にp02ビットシフトする) #defcfunc RightBitShift int p01, int p02 if( p02 > 0 ) { _p01 = p01 >> p02; // そのまま右にビットシフト // 最上位ビットが0の場合はそのまま0埋めされるので、最上位ビットが1の時のみ処理する if( p01 & 0x80000000) { _p01_2 = 0x80000000 >> ( p02 - 1 ); // 上とは別で1桁少なく1埋めしたビットシフトを算出 _p01 ^= _p01_2; // 排他的論理和の性質を利用して、上位の不要なビットを0(偽)にする } } else { // ビットシフトする桁が0以下の場合はそのまま元の数値を返す _p01 = p01; } return _p01 #global // 以下サンプル x = 0x8123ABCD; // 最上位ビットが1の適当な数値 y = RightBitShift( x, 15 ); // 0埋めで右に15ビットシフト mes y; x = 0x7123ABCD; // 最上位ビットが0の適当な数値 y = RightBitShift( x, 15 ); // 0埋めで右に15ビットシフト mes y;



js2hsp

リンク

2020/6/24(Wed) 07:08:38|NO.90854

あらやさんありがとうございました。
解決



MIZUSHIKI

リンク

2020/6/24(Wed) 12:32:40|NO.90856

ビットをゼロにしたいときは "押し込んで、引っ込める" って聞きました。

解決されていますが、#define版を作ったので投稿してみます。

//1回だけズラして最上位ビットを0に。そして残りのシフトをする。 #define ctype RightBitShift2(%1,%2) ( ((%1 >> 1) | 0x80000000 ^ 0x80000000 ) >> (%2-1) ) // 以下サンプル x = 0x8123ABCD; // 最上位ビットが1の適当な数値 y = RightBitShift2( x, 15 ); // 0埋めで右に15ビットシフト mes y; // 確認 color 255,0,0 mes " x>>15 = "+ ( x >> 15 ) + " ←これはNG" color x = 0x7123ABCD; // 最上位ビットが0の適当な数値 y = RightBitShift2( x, 15 ); // 0埋めで右に15ビットシフト mes y;



Velgail

リンク

2020/6/24(Wed) 19:28:33|NO.90858

解決してますが更に追加で、懐かしの「ちょっとしたソースコードを投稿するスレ」から

http://hsp.tv/play/pforum.php?mode=pastwch&num=72960#75066
http://hsp.tv/play/pforum.php?mode=pastwch&num=72960#75301

……というか当時の私、上にすでにあるものを再実装してたのかよ(笑)



ひよこ

リンク

2020/6/24(Wed) 19:42:30|NO.90859

> ……というか当時の私、上にすでにあるものを再実装してたのかよ(笑)

だからどうしたの?意味不明。



js2hsp

リンク

2020/6/25(Thu) 06:59:43|NO.90863

MIZUSHIKIさん、Velgailさんもありがとうございます。



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