位(bit)运算
一、二进制:所谓二进制就是逢二进一 (0,1), 因为使用二进制只有 0, 1 两个数,简单,易于电子方式实现 , 同时,通过0,1 组合可以表示任意一个数.
二进制有三个重要的概念:
1.原码
用二进制来表示一个数,这个码就是原码.
1 ------> 原码 00000000 0000000 0000000 00000101 = 1 2的零次方+0 2的一次方+1* 2的二次方=1+0+4=5
2.负数的反码=它的原码符号位不变,其它位取反(0->1,1->0)
反码(正数的反码和它的原码一样 , 负数反码 是 符号位不变其它位取反)
补码(正数的补码和它的原码一样,负数的补码是 它的反码+1)
举例
-1
-1的原码 10000000 00000000 00000000 00000001
-1的反码 11111111 11111111 11111111 11111110
-1 的补码 11111111 11111111 111111111 11111111
3. 在计算机运算的时候,都是以补码的方式来运算的
4+5=>计算机 4-5=4+(-5)
这句话意思就是,不管一个数是正数还是负数,都要被转成补码,然后进行运算.
位运算一览表:
该图的前面四个是位运算
其运算规则是:
按位与& : 两位全为1,结果为1
按位或| : 两位有一个为1,结果为1
按位异或 ^ : 两位一个为0,一个为1,结果为1
按位取反 : 0->1 ,1->0
<h3>求解:~2=?</h3>
步骤 : 首先要求出 2的补码
2是正数 所以 原码=反码=补码
2 原码
00000000 00000000 00000000 00000010
~2
11111111 11111111 11111111 11111101 (补码)->原码
? 负数的 原码-》反码-》补码
11111111 11111111 11111111 11111101->
推出其反码 (对补码-1)
11111111 11111111 11111111 11111100
推出原码
10000000 00000000 00000000 0000011 -> -3
~-5=?
-5 的 补码找出来.
-5 原码 10000000 00000000 00000000 00000101
-5 反码 11111111 11111111 11111111 11111010
-5 补码 11111111 11111111 11111111 11111011
~-5取反 00000000 00000000 00000000 00000100 (补码)
4
3 的补码 00000000 00000000 00000000 00000011
2&3 00000000 00000000 00000000 00000010 [补码]
2 的补码 00000000 00000000 00000000 00000010
3 的补码 00000000 00000000 00000000 00000011
2^3 00000000 00000000 00000000 00000001
二:位移运算:在php 中位运算有两种 >> (右移) << (左移)
运算的规则是 :
算术右移:低位溢出,符号位不变,并用符号位补溢出的高位
算术左移: 符号位不变,低位补0
根据我们前面的规范,来完成几个案例
$a=1>>2;
1 的补码
00000000 00000000 00000000 00000001
1>>2
00000000 00000000 00000000 00000000
$b=-1>>2;
$c=1<<2;
1<<2
1的补码
00000000 00000000 00000000 00000001
00000000 00000000 00000000 00000100
绛旓細鍦ㄨ绠楁満鏈涓璪it鐨勪腑鏂囧惈涔夋槸浣嶃傝绠楁満涓殑浜岃繘鍒舵暟绯荤粺涓紝浣嶏紝绠璁颁负b,涔熺О涓烘瘮鐗癸紝姣忎釜0鎴1灏辨槸涓涓浣(bit)銆傝绠楁満涓殑CPU浣嶆暟鎸囩殑鏄疌PU涓娆¤兘澶勭悊鐨勬渶澶т綅鏁般備簩杩涘埗鏁扮郴缁熶腑锛屼綅绠璁颁负b,涔熺О涓烘瘮鐗癸紝姣忎釜浜岃繘鍒舵暟瀛0鎴1灏辨槸涓涓綅(bit)銆備綅鏄暟鎹瓨鍌ㄧ殑鏈灏忓崟浣嶏紝鍏朵腑8bit灏辩О涓轰竴涓...
绛旓細涓涓瓧鎵鍚殑浜岃繘鍒朵綅鏁版垚涓哄瓧闀裤傚瓧闀挎槸琛¢噺璁$畻鏈烘ц兘鐨勪竴涓噸瑕佹寚鏍囷紝瀛楅暱瓒婇暱锛岃绠楁満涓娆℃墍鑳藉鐞嗕俊鎭殑瀹為檯浣嶆暟灏辫秺澶氾紝杩愮畻绮惧害灏辫秺楂橈紝鏈缁堣〃鐜颁负璁$畻鏈虹殑澶勭悊閫熷害瓒婂揩銆傚父鐢ㄧ殑瀛楅暱鏈8浣嶃16浣嶃32浣嶅拰64浣嶇瓑銆傚弬鑰冭祫鏂 钁f闆.澶у璁$畻鏈哄簲鐢ㄥ熀纭.鍘﹂棬锛氬帵闂ㄥぇ瀛﹀嚭鐗堢ぞ锛2016骞 ...
绛旓細璁$畻鏈轰腑鏁版嵁鍗曚綅鐨勬槸bit(姣旂壒)銆傚湪璁$畻鏈哄唴閮紝鏁版嵁閮芥槸浠ヤ簩杩涘埗鐨勫舰寮忓瓨鍌ㄥ拰杩愮畻鐨勪綅浜岃繘鍒舵暟鎹腑鐨勪竴涓浣嶏紙bit锛绠鍐欎负b锛岄煶璇戜负姣旂壒锛屾槸璁$畻鏈哄瓨鍌ㄦ暟鎹殑鏈灏忓崟浣嶃備竴涓簩杩涘埗浣嶅彧鑳借〃绀0鎴1涓ょ鐘舵侊紝瑕佽〃绀烘洿澶氱殑淇℃伅锛屽氨瑕佹妸澶氫釜浣嶇粍鍚堟垚涓涓暣浣擄紝涓鑸互8浣嶄簩杩涘埗缁勬垚涓涓熀鏈崟浣嶃傚瓧鑺傚瓧鑺傛槸...
绛旓細3銆佸瓧鑺傦細鑻辨枃Byte锛岄煶璇戜负鈥滄嫓鐗光濓紝涔犳儻涓婄敤澶у啓鐨勨淏鈥濊〃绀恒傚瓧鑺傛槸璁$畻鏈轰腑鏁版嵁澶勭悊鐨勫熀鏈崟浣嶃4銆佷綅鍜屽瓧鑺傜殑鍏崇郴锛氳绠楁満涓互瀛楄妭涓哄崟浣嶅瓨鍌ㄥ拰瑙i噴淇℃伅锛岃瀹氫竴涓瓧鑺傜敱鍏釜浜岃繘鍒朵綅鏋勬垚锛屽嵆1涓瓧鑺傜瓑浜8涓瘮鐗癸紙1Byte=8bit锛銆傚叓浣嶄簩杩涘埗鏁版渶灏忎负00000000锛屾渶澶т负11111111锛涢氬父1涓瓧鑺傚彲浠ュ瓨鍏...
绛旓細鎰忎负鍦ㄤ簩杩涘埗鐨勬潯浠朵笅锛1Byte=8bit锛1BYTE鏈夌鍙峰彇鍊艰寖鍥存槸璐1111111鍒版1111111锛屽湪鏈夌鍙疯鍒欎笅锛岀涓浣0鍜1浠h〃鏁板瓧鐨勬璐熴1Byte=8bit锛屼簩杩涘埗涓嬶紝鏃犵鍙锋暣鏁板彇鍊艰寖鍥存槸00000000-11111111锛屾湁绗﹀彿鍙栧艰寖鍥存槸璐1111111鍒版1111111锛屽洜涓哄湪鏈夌鍙疯鍒欎笅锛岀涓浣0鍜1浠h〃鏁板瓧鐨勬璐燂紝鎹㈡垚鍗佽繘鍒跺氨鏄棤...
绛旓細bitget(A,[6:-1:1])灏嗗彇鍑篈鐨勭6,5,4,3,2,1浣嶇粍鎴愬垪琛ㄣ俠itset鍑芥暟鍒欏彲浠ヨ缃叾涓竴浣嶆暟鎹傜敤娉曟槸 bitset(鏁版嵁,bit浣,[闄勫姞鏁板糫,[鍋囪绫诲瀷] ) 褰撻檮鍔犳暟鍊奸潪闆舵椂锛岀浉搴攂it浣嶈缃1锛屽惁鍒欒缃0.bitshift鍙互鐢ㄦ潵绉讳綅杩愮畻銆俠itshift(A,5,'uint8')琛ㄧず灏咥鐪嬩綔鍏綅鏁村瀷锛屽悜宸︾Щ鍔5浣嶃
绛旓細瀛楄妭锛岃嫳鏂嘊yte锛屾槸璁$畻鏈虹敤浜庤閲忓瓨鍌ㄥ閲忕殑涓绉嶈閲忓崟浣嶏紝閫氬父鎯呭喌涓嬩竴瀛楄妭绛変簬鍏綅锛屽瓧鑺傚悓鏃朵篃鍦ㄤ竴浜涜绠楁満缂栫▼璇█涓〃绀烘暟鎹被鍨嬪拰璇█瀛楃锛屽湪鐜颁唬璁$畻鏈轰腑锛屼竴涓瓧鑺傜瓑浜庡叓浣嶏紱4銆佸瓧 瀛楁槸琛ㄧず璁$畻鏈鸿嚜鐒舵暟鎹崟浣嶇殑鏈锛屽湪鏌愪釜鐗瑰畾璁$畻鏈轰腑锛屽瓧鏄叾鐢ㄦ潵涓娆℃у鐞嗕簨鍔$殑涓涓浐瀹氶暱搴︾殑浣嶏紙bit锛缁勶紝...
绛旓細甯冨皵鍜岃绠楁満鏈潵娌′粈涔堝叧绯伙紝甯冨皵鐨勬潵鍘嗚拷婧埌19涓栫邯鐨勭鍙烽昏緫瀛﹀锛氫箶娌宦峰竷灏旓紝鍥犱负浠栫殑璐$尞闈炲父澶э紝鎵浠ラ昏緫杩愮畻鍙堢О涓哄竷灏旇繍绠椼傛瘮鐗规槸璁$畻鏈虹殑姒傚康锛屽畠鎸囦簩杩涘埗鏁版嵁鐨勬煇涓浣嶏紝鍙兘鍙1鍜0涓ょ鍊硷紝杩欏拰甯冨皵杩愮畻鏄粨鍚堥潪甯歌嚜鐒剁殑锛岀畝鐩村氨鏄噺韬畾鍋氥
绛旓細璁$畻鏈哄瓨鍌ㄤ俊鎭殑鏈灏忓崟浣嶏紝绉颁箣涓浣嶏紙bit锛屽張绉版瘮鐗癸級 銆傚瓨鍌ㄥ櫒涓墍鍖呭惈瀛樺偍鍗曞厓鐨勬暟閲忕О涓哄瓨鍌ㄥ閲忥紝鍏惰閲忓熀鏈崟浣嶆槸瀛楄妭锛圔yte銆傜畝绉癇锛夛紝8涓簩杩涘埗浣嶇О涓1涓瓧鑺傦紝姝ゅ杩樻湁KB銆丮B銆丟B銆乀B绛夛紝瀹冧滑涔嬮棿鐨勬崲绠楀叧绯绘槸1Byte锛8bit锛1KB=1024B锛1MB=1024KB锛1GB=1024MB锛1TB=1024GB銆俆B锛堝彛璇畝绉...
绛旓細鍦ㄨ绠楁満鍐呴儴锛屼俊鎭兘鏄痏鐢ㄤ簩杩涘埗鐨勫舰寮忚繘琛屽瓨鍌ㄣ杩愮畻銆佸鐞嗗拰浼犺緭鐨勩備俊鎭瓨鍌ㄥ崟浣嶆湁浣嶃佸瓧鑺傚拰瀛楃瓑鍑犵銆傚悇绉嶅瓨鍌ㄨ澶囧瓨鍌ㄥ閲忓崟浣嶆湁KB銆丮B銆丟B鍜孴B绛夊嚑绉嶃1銆佸熀鏈偍瀛樺崟鍏 浣嶏紙bit锛锛氫簩杩涘埗鏁颁腑鐨勪竴涓暟浣嶏紝鍙互鏄0鎴栬1锛屾槸璁$畻鏈轰腑鏁版嵁鐨勬渶灏忓崟浣嶃傚畤鑺傦紙Byte锛孊锛夛細璁$畻鏈轰腑鏁版嵁鐨勫熀鏈崟浣...