org.sonar.plugins.csharp.S2437.html Maven / Gradle / Ivy
Why is this an issue?
Certain bitwise operations
are not needed and should not be performed because their results are predictable.
Specifically, using & -1
with any value always results in the original value.
That is because the binary representation of -1
on a integral numeric type supporting
negative numbers, such as int
or long
, is based on two’s
complement and made of all 1s: 0b111…111
.
Performing &
between a value and 0b111…111
means applying the &
operator to each bit of the value
and the bit 1
, resulting in a value equal to the provided one, bit by bit.
anyValue & -1 // Noncompliant
anyValue // Compliant
Similarly, anyValue | 0
always results in anyValue
, because the binary representation of 0
is always
0b000…000
and the |
operator returns its first input when the second is 0
.
anyValue | 0 // Noncompliant
anyValue // Compliant
The same applies to anyValue ^ 0
: the ^
operator returns 1
when its two input bits are different
(1
and 0
or 0
and 1
) and returns 0
when its two input bits are the same (both
0
or both 1
). When ^
is applied with 0
, the result would be 1
if the other input is
1
, because the two input bits are different, and 0
if the other input bit is 0
, because the two input are the
same. That results in returning anyValue
.
anyValue ^ 0 // Noncompliant
anyValue // Compliant
Resources
Documentation
- Bitwise operations (C#
reference)
- And Operator (Visual Basic)
- Or Operator (Visual Basic)
- Xor Operator (Visual Basic)
- Integral numeric types (C#
reference)
- Numeric Data
Types (Visual Basic)
- Two’s complement
Articles & blog posts