:このような 何か。あなたが代わりにシフトするビットであるあなたが本当に何をやっているので、代わりに生の整数の除算のジェネリックRShift~&
機能を使用することができます
DIM x(0 TO 3) AS _UNSIGNED _BYTE
a& = &HCEED6644&
x(0) = (a& AND &HFF000000&) \ 2^24
x(1) = (a& AND &H00FF0000&) \ 2^16
x(2) = (a& AND &H0000FF00&) \ 2^8
x(3) = a& AND &HFF&
PRINT HEX$(x(0)); HEX$(x(1)); HEX$(x(2)); HEX$(x(3))
注:その時に
x(0) = RShift~&(a& AND &HFF000000&, 18)
...
FUNCTION RShift~& (value AS _UNSIGNED LONG, shiftCount AS _UNSIGNED BYTE)
' Raise illegal function call if the shift count is greater than the width of the type.
' If shiftCount is not _UNSIGNED, then you must also check that it isn't less than 0.
IF shiftCount > 32 THEN ERROR 5
RShift~& = value/2^shiftCount
END FUNCTION
ビルは、あなたが別の関数を作成することがあります: (2の累乗による乗算)左にビットシフトLShift~&
関数を使用したこと
FUNCTION ByteAt~%% (value AS _UNSIGNED LONG, position AS _UNSIGNED BYTE)
'position must be in the range [0, 3].
IF (position AND 3) <> position THEN ERROR 5
ByteAt~%% = RShift~&(value AND LShift~&(&HFF&, 8*position), 8*position)
END FUNCTION
注意。潜在的により良い代替手段がLShift~&
の必要性を排除する、第1の右シフトを実行し、単に下位8ビットをマスクすることであろう。
FUNCTION ByteAt~%% (value AS _UNSIGNED LONG, position AS _UNSIGNED BYTE)
'position must be in the range [0, 3].
IF (position AND 3) <> position THEN ERROR 5
ByteAt~%% = RShift~&(value, 8*position) AND 255
END FUNCTION
なお、FreeBASICのとして知られている別のQBのような実装は、実際SHR
オペレータを有する
、潜在的により速い除算を使用する代わりに直接シフト演算を実行するために
MOD
または
AND
のように使用されます。
ます。また、シフト操作を実行しますC++で関数を作成するQB64の
DECLARE LIBRARY
機能を使用することができます
:
/*
* Place in a separate "shift.h" file or something.
*/
unsigned int LShift (unsigned int n, unsigned char count)
{
return n << count;
}
unsigned int RShift (unsigned int n, unsigned char count)
{
return n >> count;
}
ここでフル対応QB64コードです:QB64は文書化されたAPIを持っていた場合
DECLARE LIBRARY "shift"
FUNCTION LShift~& (value AS _UNSIGNED LONG, shiftCount AS _UNSIGNED _BYTE)
FUNCTION RShift~& (value AS _UNSIGNED LONG, shiftCount AS _UNSIGNED _BYTE)
END DECLARE
x(0) = ByteAt~%%(a&, 0)
x(1) = ByteAt~%%(a&, 1)
x(2) = ByteAt~%%(a&, 2)
x(3) = ByteAt~%%(a&, 3)
END
FUNCTION ByteAt~%% (value AS _UNSIGNED LONG, position AS _UNSIGNED BYTE)
'position must be in the range [0, 3].
IF (position AND 3) <> position THEN ERROR 5
ByteAt~%% = RShift~&(value, 8*position) AND 255
END FUNCTION
シフト・カウントが高すぎる場合、C++の動作に頼ってシフト・カウントを無視するのではなく、C++コードからQB64エラーを発生させる可能性があります。残念ながら、これは当てはまらず、実際には価値があるよりも多くの問題を引き起こす可能性があります。
ああ、ありがとうございます!それはおそらく私の人生で見た最も詳細な答えでした! – Aureal