- PR -

符号なし

1
投票結果総投票数:7
JAVA 7 100.00%
  • 投票は恣意的に行われます。統計的な調査と異なり、投票データの正確性や標本の代表性は保証されません。
  • 投票結果の正当性や公平性について、@ITは一切保証も関与もいたしません。
投稿者投稿内容
hide
会議室デビュー日: 2007/09/24
投稿数: 5
投稿日時: 2007-10-29 22:52
0x80をbyteで受け取り、2進数で10000000に変換してから
算術シフト<<3を行いたいのですが、
2進数の変換時に符号付で判断してしまうため、
算術シフトを行うと欲しい値になりません。
符号を取り除く方法があるのでしょうか?

BufferedInputStreamのreadメソッドで取得したbyteデータになります。
AOFG
会議室デビュー日: 2007/09/07
投稿数: 11
投稿日時: 2007-10-30 00:05
引用:

hideさんの書き込み (2007-10-29 22:52) より:
0x80をbyteで受け取り、2進数で10000000に変換してから
算術シフト<<3を行いたいのですが、
2進数の変換時に符号付で判断してしまうため、
算術シフトを行うと欲しい値になりません。
符号を取り除く方法があるのでしょうか?



何を投票すべきなのか分からず、
左シフトに符号つきも符号なしも無いと思うのですが、
Javaで右シフトなら、いろんなところで
>> 3 が符号つき
>>> 3 が符号なし
って書いてある様に思います

あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-10-30 00:49
もう少し整数表現や演算規則を勉強しましょう。
一週間ほど前に同じような質問を見かけました。

byte b = (byte)0x80;
System.out.println(b << 3);

この出力結果が-1024になってしまうという事ですか?

それならば、

byte b = (byte)0x80;
System.out.println((b & 0xff) << 3);

で望みの結果になると思います。

この理由にシフト演算(左シフトには算術も論理もないし)は関係なく、
整数式の評価時には常にint(やlong)に拡張して計算されるからです。

つまり、符号拡張により0xffffff80 << 3と同じ意味になってしまいます。
1

スキルアップ/キャリアアップ(JOB@IT)