我需要对以下语句进行一些解释,它在做什么?:
int result = 154 + (153 << 8) + (25 << 16) + (64 << 24);
/* what would be the value of result after this line and how it is calculated
Why we need this? */
最佳答案
(153 << 8)
等效于153 * pow(2, 8)
您实际上是在向左移动位。
另外:-(153 >> 8)
等效于153 / pow(2, 8)
您可以猜出原因..这实际上是在向右移动位。
例如:-
3 => 0011
3 << 2 is equal to 1100 -> (Which is code for 12)
3 >> 2 is equal to 0000 -> (Which is code for 0) -> you can see - **(3 / 4 = 0)**
注意:-请注意
right shifting rounds off towards negative infinity
..例如:-
-3 >> 1 --> -2 (-1.5 is rounded to -2)
让我们看看它是如何发生的:-
用二进制字符串表示:-
-3 ==> 11111111111111111111111111111101
-3 >> 1 ==> 11111111111111111111111111111110 (-3 / 2 = -1.5 -> rounded to -2)
(请注意,最左位由移位前最左端存在的位填充(在这种情况下为1))
因此,该值变为-2(对于-3 >> 1,它大于
-3
)对于负数会发生这种情况。
Right shifting a negative number gives a number greater than the original number..
与正数相反,在正数中,最左边的位将由
0
填充。因此,value obtained will be less than the original..
3 ==> 00000000000000000000000000000011
3 >> 1 ==> 00000000000000000000000000000001 (3 / 2 = 1.5 -> rounded to 1)
(因此,最左边的位保持为0。因此,值是1(小于3),即,值朝负无穷大取整,并从1.5变为1)。
同样,您可以为
left-shifting
正数和负数设计结果。