pragma mark 位運算02-左移右移
pragma mark 概念
/**
*
左移 <<
右移 >>
應(yīng)用場景:如果想讓某一個數(shù)乘以2的多少次冪,或者除以2的多少次冪,最高效的運算方式就是左移右移
*/
pragma mark 代碼
#include <stdio.h>
int main()
{
#pragma mark 左移
/**
左移 : <<
9 << 1 ?
9 << 2 ?
規(guī)律: 左移就是用左移動的數(shù)乘以2的移動次冪
例如:
9 << 1 == 9 * 2(1) == 18
9 << 2 == 9 * 2(2) == 36
注意點:
由于左移運算,被移動的數(shù)的最高位會被拋棄(移除),所以左移有可能會改變一個數(shù)的正負性
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 = ?
規(guī)律: 右移就是右移動的數(shù) 除以 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
注意:負數(shù)的左移右移是補碼在移動,因為負數(shù)都是以補碼的形式存儲在內(nèi)存中的
應(yīng)用場景:如果想讓某一個數(shù)乘以2的多少次冪,或者除以2的多少次冪,最高效的運算方式就是左移右移
*/
printf("%i\n",-9 >> 1);
return 0;
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。