left shift question

Started by
8 comments, last by GameDev.net 18 years ago
ok, how does this work int a = 1; int b = 31; int c = a << b; please explain how c works. thanks.
Advertisement
How well do you know binary?

These are the values...
a0000-0000-0000-0000-0000-0000-0000-0001c1000-0000-0000-0000-0000-0000-0000-0000|----------------31 = b----------------|
Quote:Original post by rip-off
How well do you know binary?

These are the values...
a0000-0000-0000-0000-0000-0000-0000-0001c1000-0000-0000-0000-0000-0000-0000-0000|----------------31 = b----------------|


thanks
Well, I'm not quiet sure about what you want to know.
Basically, what that's doing is to shift the 'a' value 31 bits to the left.

So:1 = binary: 00000000 00000000 00000000 00000001And after shifting it will become-2147483648 = binary: 10000000 00000000 00000000 00000000


for example, if you shift 1 (binary: 00000001) to the left by 2 bits you'll get 4 (binary: 00000100).

If you want to know how it really shifts those bits, well, x86 assembly has those instructions, so it's not manually done, the result is calculated inside the CPU.

[edit:] beaten to it... damn, I'm slow...
[edit2:] I had given a valid example, but not what I wanted xD. Anyway, it's correct now.

[Edited by - Kamikaze15 on April 16, 2006 8:31:38 PM]
31337noob, be careful about sign extension when doing right-shifts as a right-shift on signed numbers is implementation defined. So, if you right-shifted a signed variable and the high (last) bit was set (the number is negative) then two things can happen: The high bit and preceding ones could be shifted right (keeping the number negative) or, it could fill the shifts with zero, making the number non-negative. If you're not shifting negative numbers, use unsigned.

- xeddiex
one..
Quote:Original post by 31337noob
ok, how does this work

int a = 1;
int b = 31;
int c = a << b;



One way to think of shifting right and left is to imagine that you are dividing or multiplying by powers of 2 (since we are operating in binary. See Kamikaze's binary representation example to understand why).

So, shifting left by 2 is same as multiplying a number by 2^2. Right shifting a number by 2 is same as dividing by 2^2.

In the code you've given, a << b will be same as 1 * 2^31 whose result will be assigned to c.

As for understanding C you need to buy a good book and practice lots! :)


"There is no dark side of the moon." - Pink Floyd
There are actually different names for all the different kinds of shifts. The most common are Logical Shifts and Arithmatic Shifts.

A Logical shift just moves the bits around without concern for the sign.
An Arithmatic moves the bits around while taking into account the sign. Some examples(in 8 bit, because 32 bit isn't needed to get the point across)
Original value:10011000Left Logical Shift twice:01100000Right Logical Shift twice:00100110Left Arithmatic Shift twice:01100000Right Arithmatic Shift twice:11100110


There are variations on this, see this entry of wikipedia for additional info. In C and C++ arithmatic shifts occure when shifting signed variables, and logical shifts occur when shifting unsigned variables.

Consule this entry of wikipedia for additional information
http://en.wikipedia.org/wiki/Bitwise_operation

[Edited by - nobodynews on April 17, 2006 4:44:24 PM]

C++: A Dialog | C++0x Features: Part1 (lambdas, auto, static_assert) , Part 2 (rvalue references) , Part 3 (decltype) | Write Games | Fix Your Timestep!

Quote:Original post by nobodynews
Left Arithmatic Shift twice:
11100000


Whilst the rest of your post is correct, this one is wrong. There is no difference between a left logical shift and a left arithmetic shift.
whoopsie, I'll change it.

C++: A Dialog | C++0x Features: Part1 (lambdas, auto, static_assert) , Part 2 (rvalue references) , Part 3 (decltype) | Write Games | Fix Your Timestep!

The Windows Calc has a "Lsh" (left-shift) function. You could, you know, use it for visualization purposes.

This topic is closed to new replies.

Advertisement