掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
ビット操作後のAND (ID:46939)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
たびたびお世話になっています。yTakeといいます。 問題自体は解決しましたが、少々解説頂ければ幸いに存知ます。 バイナリーデータのビット操作(シフト)後のAND処理についてです。 元々、LongWordとすべきところをLongIntとしていた為、レンジエラーが生じていた物です。4バイト整数データを取り出すのに1バイト毎に読み出し、8ビットずつシフトさせた後、加算して数値化しています。 ===引用抜粋=== var c0, c1, c2, c3, Sx : LongWord; buf : PAnsiChar; c0 := Integer( buff[ M ]) and $000000FF; c1 := ( Integer( buff[ M + 1 ]) shl 8 ) and $0000FF00; c2 := ( Integer( buff[ M + 2 ]) shl 16 ) and $00FF0000; c3 := ( Integer( buff[ M + 3 ]) shl 24 ) and $FF000000; Sx := C0 + C1 + C2 + C3; Matrix[ i ][ k ] := Sx; M := M + 4; ===引用抜粋=== 元々、LongIntとして定義して時はANDを取っていなかったのですが、その時はたまたま、読み取る4バイトデータが最上位ビットを使用しない値だったので、レンジエラーは生じていませんでした。(”c3 := ”の行でレンジエラー) 4バイトデータに"2147483648"以上のデータを含む場合にレンジエラーとなり判明した次第です。 ここで、LongIntをLongWordに定義し直す事で済むと思いましたが、 最上位バイトのデータをシフト後、ANDを取っておかないとやはりレンジエラーとなっています。 シフト後のANDはシフト時のビットゴミを0でマスクする程度に思っていましたので、必ずしもANDを取らなくても、レンジエラーとまではならない様に思えますが、なぜ、レンジエラーになるのでしょうか? 変数型をWordとする事で最上位ビットは数値データとみなされていて、Integerの場合では符号ビットとみなされてしまう為、レンジエラーとなっていたと考えます。 長々となってしまいましたが、解釈に苦慮しています。 ご教授頂ければと思います。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.