c语言位运算左移右移6,第06天C语言(05):位运算02-左移右移

#pragma mark 位运算02-左移右移 ###pragma mark 概念

/**

*

左移 <<

右移 >>

应用场景:如果想让某一个数乘以2的多少次幂,或者除以2的多少次幂,最高效的运算方式就是左移右移

*/

###pragma mark 代码

#include

int main()

{

#pragma mark 左移

/**

左移 : <<

9 << 1 ?

9 << 2 ?

规律: 左移就是用左移动的数乘以2的移动次幂

例如:

9 << 1 == 9 * 2(1) == 18

9 << 2 == 9 * 2(2) == 36

注意点:

由于左移运算,被移动的数的最高位会被抛弃(移除),所以左移有可能会改变一个数的正负性

0000 0000 0000 0000 0000 0000 0000 1001 // 用于对比

000 0000 0000 0000 0000 0000 0000 10010 // 16 + 2 = 18

0000 0000 0000 0000 0000 0000 0000 1001 // 用于对比

00 0000 0000 0000 0000 0000 0000 100100 // 32 + 4 = 36

*/

printf("%i\n",9<<2);

#pragma mark 右移

/**

右移: >>

9 >> 1 = ?

9 >> 2 = ?

规律: 右移就是右移动的数 除以 2的移动次幂

9 >> 1 == 9/ 2(1) == 4

9 >> 2 == 9/ 2(2) == 2

0000 0000 0000 0000 0000 0000 0000 1001 // 用于对比

0 0000 0000 0000 0000 0000 0000 0000 100 // 4

0000 0000 0000 0000 0000 0000 0000 1001 // 用于对比

0 00000 0000 0000 0000 0000 0000 0000 10 // 2

-9 >> 1

1000 0000 0000 0000 0000 0000 0000 1001 // 用于对比

1000 0000 0000 0000 0000 0000 0000 1001 // 原码

1111 1111 1111 1111 1111 1111 1111 0110 // 反码

1111 1111 1111 1111 1111 1111 1111 0111 // 补码 最高位的第二位 补1 砍掉最后一位

11111 1111 1111 1111 1111 1111 1111 011 // 右移一位

00000 0000 0000 0000 0000 0000 0000 001 // -1

----------------------------------------

11111 1111 1111 1111 1111 1111 1111 010 // 反码

10000 0000 0000 0000 0000 0000 0000 101 // 原码 1 + 4 = 5 最高位是 1 所以为-5

注意:负数的左移右移是补码在移动,因为负数都是以补码的形式存储在内存中的

应用场景:如果想让某一个数乘以2的多少次幂,或者除以2的多少次幂,最高效的运算方式就是左移右移

*/

printf("%i\n",-9 >> 1);

return 0;

}