Arithmetic Right Shift vs Logical Right Shift in Java, Rust, C++, Python
Certainly. Here's the explanation in English:
>>
and >>>
are bitwise shift operators, where >>
is an arithmetic right shift, and >>>
is a logical right shift. The main distinction between the two lies in how they handle negative numbers.
Arithmetic Right Shift (
>>
):In an arithmetic right shift, the sign bit (the highest bit) is replicated to the newly created positions.
This means that positive numbers remain positive after shifting, and negative numbers remain negative.
Logical Right Shift (
>>>
):In a logical right shift, the highest bit is always set to 0, regardless of whether the original number was positive or negative.
This means that negative numbers become positive after a logical right shift.
Here's how these shift operators behave in different languages:
Java:
Supports both
>>
(arithmetic right shift) and>>>
(logical right shift).For example,
-4 >> 1
results in-2
, whereas-4 >>> 1
results in a large positive number.
C++:
Only supports
>>
.However, for unsigned integers, the behavior of
>>
is the same as a logical right shift.For signed integers, the behavior of
>>
is an arithmetic right shift.For instance, with
int x = -4; x >> 1
the result is-2
. But withunsigned int y = -4; y >> 1
,-4
first converts to a large positive number, and then the shift operation takes place.
Python:
Only supports
>>
, and it behaves as an arithmetic right shift.For example,
-4 >> 1
results in-2
.
Rust:
Supports both
>>
and>>>
.For signed integer types like
i32
,i64
,>>
is an arithmetic right shift, while>>>
is a logical right shift.For unsigned integer types like
u32
,u64
, the behavior of>>
and>>>
is the same, both acting as logical right shifts.For instance, with a signed integer
-4i32
,-4i32 >> 1
results in-2i32
, whereas-4i32 >>> 1
produces a large positive number.
In conclusion, different languages have slight variances in their support for shift operators, especially in terms of arithmetic vs logical right shift. When using shift operations, it's prudent to be aware of the behavior in the specific language, especially when dealing with signed and unsigned integers.
Subscribe to my newsletter
Read articles from Retriever directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by