2016-12-16 18 views
2

Java仕様を読んでいます。負のオペランドの符号付き右シフト演算子

n >> sの値は右シフトされたビット位置で、 sign-extensionになります。結果の値はfloor(n/2s)です。非負の場合、nの値は であり、整数除算演算子/によって計算された が2にべき乗されるので、これは整数除算を切り捨てることに相当します。

だから私は、次がある場合:

27 >> 3 // 00011011 >> 3 = 00000011 = 3 = 27/8 

結果が3です。実際には27/8 = 3.375なので、3は切り捨てられた値です。

の左オペランドが負の場合、仕様は何も言わないです。だから、

私は、次のしている場合:

-50 >> 2 // 11001110 >> 2 = 11110011 = -13 != -50/4 

結果が-13です。 - 50/4 = -12.5、したがって-13は切り捨てられた値ではありません。

左オペランドが負の値の場合はシステムJavaを丸めますか?

ceil(n/2s)?

答えて

8

結果の値はfloor(n/2s)です。

フロアは、負の無限大に向かって丸めを意味します。これは、切り捨て、すなわち小数部分の削除と同じではありません。切り捨てを行うと、正の数値は切り捨てられ、負の数値は切り上げられます。

-12.5の床は-13です。一般的にJavaがそれだけでいくつかのビットをシフトし、まったく丸めシステムを使用していません話す

Demo.

+0

あなたの番号が> n.5の場合、結果は切り上げになります。 -77/8で試してください。その結果は-9.625であり、コンパイラは-10を返します。 -9ではない! – xdevel2000

+1

@xdevel -10は-9.625よりも小さいので、これはどのように切り上げられますか? – Ingo

+0

Damn。あなたが正しい。ごめんなさい! – xdevel2000

1

floorまたはceilが必要な場合は、floorまたはceilを使用し、必要に応じてビットシフト演算子を使用します。

関連する問題