How does C++ do bitwise "or" operations on negative numbers?
Asked Answered
L

6

7

When I give to a variable such value: e = 17|-15; , I get -15 as an answer after compiling.I can't understand what arithmetic c++ uses. How does it perform a bit-wise OR operation on negative decimals?

Lemmuela answered 14/1, 2013 at 21:22 Comment(12)
2's complement....?Goodwin
Technically, I think it's implementation-dependent.Shoop
It probably does the OR on the value's plain two's-complement data..Jada
@FrédéricHamidi, Technically, though you'd be hard-pressed to find an exception.Planish
I performed the operation on their 2's complement representations but i don't get -15 anywayLemmuela
@chris, practically, yes. But do you mean now or in the future? :)Shoop
@user1978522 Really? Then you did it wrong ;)Timmytimocracy
If you didn't get -15 as an answer, then you did something wrong. Maybe you didn't convert to two's-complement form correctly. Or maybe you had some bits misaligned.Foran
this is such a fastest gun questionInlay
@FrédéricHamidi Yes, according to the C++ standard (in 3.9.1.7) it is implementation dependent to support architectures that are not necessarily 2's complement. However, every architecture in the past few decades has been 2's complement-based (since it simplifies the hardware) so it is more than a safe bet.Yogurt
@FrédéricHamidi, Now, I guess. What'd coming in the future? O_oPlanish
@chris, well, nobody knows, and that's why the C++ language leaves the binary representation of signed integers for the implementation to decide. I guess my point was that almost all of them may be using two's complement now, but who knows about later?Shoop
N
25

It's just doing the operation on the binary representations of your numbers. In your case, that appears to be two's complement.

 17 -> 00010001
-15 -> 11110001

As you can see, the bitwise OR of those two numbers is still -15.

In your comments above, you indicated that you tried this with the two's complement representations, but you must have done something wrong. Here's the step by step:

 15 ->  00001111      // 15 decimal is 00001111 binary
-15 -> ~00001111 + 1  // negation in two's complement is equvalent to ~x + 1
-15 ->  11110000 + 1  // do the complement
-15 ->  11110001      // add the 1
Nonary answered 14/1, 2013 at 21:24 Comment(1)
Can I know any example where we need to use bitwise operations on negative numbers? I thought bitwise is usually on unsigned numbers.Divulge
F
7

It does OR operations on negative numbers the same way it does so on positive numbers. The numbers are almost certainly represented in two's-complement form, which gives you these values:

 17 = 0000000000010001
-15 = 1111111111110001

As you can see, all the bits of 17 are already set in −15, so the result of combining them is again −15.

Foran answered 14/1, 2013 at 21:25 Comment(0)
T
4

A bitwise or with a negative number works JUST like a bitwise or with a positive number. The bits in one number are ored with the bits in the other number. How your processor represents negative numbers is a different matter. Most use something called "two's complement", which is essentially "invert the number and add 1".

So, if we have, for simplicity, 8 bit numbers:

15 is            00001111
Inverted we get  11110000
Add one          11110001

17 is            00010001

Ored together    11110001
Telescopy answered 14/1, 2013 at 21:26 Comment(0)
S
3
   17 = b00010001
  -15 = b11110001 <--- 2s complement
| -15 = b11110001
Shears answered 14/1, 2013 at 21:25 Comment(0)
I
2

you have to looks at how the bits work

Basically, if either number has a 1 in a particular spot, than the result will also have a 1

-15       : 11110001 (two's complement)
17        : 00010001
-15 | 17  : 11110001

as you can see, the result is the same as -15

Inlay answered 14/1, 2013 at 21:26 Comment(1)
You're a very pretty two, aren't you.Font
G
2

The operator | is a "bitwise OR" operator, meaning that every bit in the target is computed as the OR-combination of the corresponding bits in the two operands. This means, that a bit in the result is 1 if any of the two bits in the numbers at the same positions are 1, otherwise 0.

Clearly, the result depends on the binary representation of the numbers which again depends on the platform.

Almost all platforms use the Two's complement, which can be thought as a circle of unsigned numbers, in which negative numbers are just in the opposite direction than positive numbers and "wrap around" the circle.

Unsigned integers:

enter image description here

Signed integers:

enter image description here

The calculation of your example is as follows.

 17:   00000000 00000000 00000000 00010001
-15:   11111111 11111111 11111111 11110001
------------------------------------------
-15:   11111111 11111111 11111111 11110001
Gavette answered 14/1, 2013 at 21:26 Comment(4)
Depends on the compiler or the platform?Shears
@AlexChamberlain I don't know for sure. If there is a platform which supports multiple different representations, there could exist two different compilers using two different representations. However, I don't think that such a platform exists.Gavette
I think the C ABI would impose a consistent representation on any one platform tbh.Shears
@AlexChamberlain I changed it to "platform".Gavette

© 2022 - 2024 — McMap. All rights reserved.