位运算详解

在深入了解各种位运算之前,需要先了解补码的概念。

原码:计算机中对数字的二进制定点表示方法,这种表示方法在数字前面加上一个符号位,“1”代表这个数是负数,“0”代表这个数是正数,除符号位之外,其余位表示该数字的值。(注意:如果明确定义为无符号整数,那么将不存在符号位,本文主要讲述的是有符号整数的情况)

先举一个简单的例子:假设一个数在内存中占8个比特位,那么在内存中一个数就用八个二进制位来表示,“1”用原码来表示就是 00000001,“-1”用原码来表示就是10000001。

这里就出现一个问题,如果用原码来表示“0”的话,会出现+0和-0两种情况,明显不可行,因此 计算机中一律是用补码来表示和存储的 ,与原码相比,使用补码可以将符号位和数值域统一处理,加法和减法也可以统一处理。那补码是什么?

在一个时钟中,时针9要变成6,可以表示为9-3,也可以表示为9+9=12+6(12为一圈)。对于计算机来说,一个数也是有一个有效范围的,在该范围内可以把加减操作都转化为加法操作,那么对于减法来说就需要有一个数补上加减之间的数差,这个数就是补数,对于计算机内部来说,这就是补码。

求补码有三种情况:正整数、负整数、零。

先看第一种情况--正整数:

(假设一个数用八个二进制位来表示)对于一个正整数来说,它的补码和原码是完全相等的,“1”的补码也是00000001,“0”的补码也是00000000。

第二种情况--负整数:

(假设一个数用八个二进制位来表示)对于一个负整数来说,它的补码等同于 该负整数的原码除符号位之外的所有位进行取反加一 ,也就是对后七位取反再加一,例如:对于数字“-1”来说,它的原码是10000001 ,取反加一之后为11111111,所以"-1"的补码就是11111111。

第三种情况--零:

(假设一个数用八个二进制位来表示)“0”用原码表示有两种方式:“00000000”和“10000000”,用补码表示只有唯一的情况,因为“10000000”转换为补码为“100000000”,而在这里一个数只能用八个二进制位表示,所以首位的1被丢弃,因此“0”的补码为“00000000”。

那么已知一个十进制数的补码怎么求出这个数呢? 对这个补码再求补码,得出的二进制数转换为十进制 。

例如:一个数的补码为“00001010”,该补码的补码是它本身,所以二进制转换为十进制为2^1+2^3=10;一个数的补码为“11110111”,从符号位可知这个数是负数,所以该补码的补码是“10001001”,转换为十进制(符号位不计)为-(2^0+2^3)=-9。

对于任何程序中的数据在计算机内存都是以二进制的形式来存储的,如果我们需要对一个整数的二进制位进行运算操作,就需要用到位运算了。通用的位运算有六种,下面将一一介绍。 (以下例子均假设一个数用8个二进制位表示且为有符号整数)

A&B:把A、B的二进制的每一位进行比较, 相同且为1则为1,不同则为0 ,返回一个二进制结果。这通常用于二进制数的取位操作,例如C&1就可以知道C的第一个二进制位是0还是1。

例子:1)5&3

2)-3&5

A|B:把A、B的二进制位的每一位进行比较, 相同且为0则为0,其余情况为1, 返回一个二进制结果。通常用于无条件赋值,例如C|1 返回的结果就是C+1的值。

例子:1)3 | 5

2)-3 | 5

~A:把A的每一个二进制位都进行取反, 1变成0,0变成1, 返回一个二进制结果。

例子:1)~5

2)~ -3

A^B:把A、B的每个二进制位进行比较, 相同为0,不同为1, 返回一个二进制数。两次异或会变成原来的值(A^B)^B=A,故异或可用于一般的加密。

例子:1)5 ^ 3

2)5 ^ -3

A<<n:将A的每一个二进制位左移n位,并在右边补n个零,相当于是A乘以2的n次方,等价于A=A*(2^n),但左移的运算速度较快。

例子:1)4<<2

2)-3<<2

A>>n:将A的每一个二进制位右移n位,并在左边补n个0(正数)或者n个1(负数),等价于A=A/(2^n),但右移的运算速度较快。需要注意的是,使用右移运算符要在数据不丢失的情况下使用,如果右移到有效位全为0了再右移就没有意义了。

例子:1)4>>2

2)-8>>2

至此,位运算的知识点全部完毕

位运算?

其实,也就是“逻辑运算”。

上过高中的,都明白这些。

学计算机的人,一般都没有好好学习。

他们弄不懂“逻辑运算”的意思,就自己编造一个词“位运算”。

其实也就是:与、或、非、异或。

仅此而已,没有什么可详解的。



  • 浣嶈繍绠绗璇﹁В
    绛旓細浣嶈繍绠绗︽瘮涓鑸殑绠楁湳杩愮畻绗﹂熷害瑕佸揩锛岃屼笖鍙互瀹炵幇涓浜涚畻鏈繍绠楃涓嶈兘瀹炵幇鐨勫姛鑳姐傚鏋滆寮鍙戦珮鏁堢巼绋嬪簭锛屼綅杩愮畻绗︽槸蹇呬笉鍙皯鐨勩備綅杩愮畻绗︾敤鏉ュ浜岃繘鍒朵綅杩涜鎿嶄綔锛屽寘鎷細鎸変綅涓庯紙锛夈佹寜浣嶆垨锛坾锛夈佹寜浣嶅紓鎴栵紙^锛夈佹寜浣嶅彇鍙嶏紙~锛夈佹寜浣嶅乏绉伙紙锛夈佹寜浣嶅彸绉伙紙锛夈備笅闈㈠氨缁欏ぇ瀹朵粙缁嶄綅杩愮畻绗︾殑璇︾粏...
  • 浣嶈繍绠楄瑙
    绛旓細瀵逛簬浠讳綍绋嬪簭涓殑鏁版嵁鍦ㄨ绠楁満鍐呭瓨閮芥槸浠ヤ簩杩涘埗鐨勫舰寮忔潵瀛樺偍鐨勶紝濡傛灉鎴戜滑闇瑕佸涓涓暣鏁扮殑浜岃繘鍒朵綅杩涜杩愮畻鎿嶄綔锛屽氨闇瑕佺敤鍒浣嶈繍绠浜嗐傞氱敤鐨勪綅杩愮畻鏈夊叚绉嶏紝涓嬮潰灏嗕竴涓浠嬬粛銆 锛堜互涓嬩緥瀛愬潎鍋囪涓涓暟鐢8涓簩杩涘埗浣嶈〃绀轰笖涓烘湁绗﹀彿鏁存暟锛堿&B锛氭妸A銆丅鐨勪簩杩涘埗鐨勬瘡涓浣嶈繘琛屾瘮杈冿紝 鐩稿悓涓斾负1鍒欎负1锛屼笉...
  • x&(-x)鍜寈&(x-1)鐨勫惈涔璇﹁В
    绛旓細鏈杩戠湅绠楁硶棰橈紝娑夊強鍒颁袱涓緢缁忓吀鐨浣嶈繍绠锛歺&(-x)锛氫繚鐣欎簩杩涘埗涓嬫渶鍚庡嚭鐜扮殑1鐨勪綅缃紝鍏朵綑浣嶇疆缃0锛堝嵆涓涓暟涓渶澶х殑2鐨刵娆″箓鐨勫洜鏁 x&(x-1)锛氭秷闄や簩杩涘埗涓嬫渶鍚庡嚭鐜1鐨勪綅缃紝鍏朵綑淇濇寔涓嶅彉 鍏蜂綋鍒嗘瀽濡備笅锛氭垜浠彲浠ヤ粠鐪嬪緟瀛楃涓茬殑瑙掑害鍘绘濊冭繖浠朵簨銆備簩杩涘埗涓嬬殑鏁板瓧閮藉彲浠ュ啓鎴愶紙A锛1锛圔锛夌殑褰㈠紡...
  • 姹:JAVA涓父鐢浣嶈繍绠绗﹀強鍏剁敤娉璇﹁В
    绛旓細int z = x&y //z绛変簬浜岃繘鍒舵暟鐨01000000 鍗杩愮畻缁撴灉涓簔绛変簬浜岃繘鍒舵暟01000000銆備綅鎴栥佷綅闈炪佷綅寮傛垨鐨勮繍绠楁柟娉曠被鍚屻傦紙2锛夊彸绉绘槸灏嗕竴涓簩杩涘埗鏁版寜鎸囧畾绉诲姩鐨勪綅鏁板悜鍙崇Щ浣嶏紝绉绘帀鐨勮涓㈠純锛屽乏杈圭Щ杩涚殑閮ㄥ垎鎴栬呰ˉ0锛堝綋璇ユ暟涓烘鏃讹級锛屾垨鑰呰ˉ1锛堝綋璇ユ暟涓鸿礋鏃讹級銆傝繖鏄洜涓烘暣鏁板湪鏈哄櫒鍐呴儴閲囩敤琛ョ爜...
  • c璇█浣嶈繍绠闂?
    绛旓細c璇█浣嶈繍绠闂瑙g瓟锛氳瑙g瓟杩欎釜闂鎴戜滑鍏堟潵鐪嬩竴涓緥瀛愶紝浠g爜濡備笅鍥句竴锛屽浘涓彸杈规槸闂涓緱鍒颁唬鐮侊紝宸﹁竟鏄繖娈典唬鐮佺殑姹囩紪鎸囦护銆備袱绉嶆儏鍐电殑涓嶅悓鐐硅缁嗚鏄庡涓嬶細绗竴绉嶆儏鍐碉細printf("%d",2>>64);鐢卞浘涓殑姹囩紪浠g爜鍙互鐪嬪嚭锛屽鏋滀袱涓暟閮芥槸甯告暟鐨勬儏鍐典笅锛屼唬鐮佷腑鏄笉鍚搴旂殑姹囩紪鎸囦护鐨勶紝鍥犱负缂栬瘧鍣...
  • java浣嶈繍绠绗璇﹁В
    绛旓細^ 鎸変綅寮傛垨锛圶OR锛 c = a ^ b >> 鍙崇Щ b = a >> 2 >>> 鍙崇Щ锛屽乏杈圭┖鍑虹殑浣嶄互0濉厖 b = a >>> 2 << 宸︾Щ b = a << 1 褰撶劧鍚屾牱鏈 &=锛寍=锛宆=锛>>=锛>>>=锛<<=銆傛湁鍏宠繖浜涙搷浣滅殑缁嗚妭鍙互鍙傜湅 www.pcvc.net/...id=247 浣嶈繍绠 鍓嶉潰浠嬬粛鐨勫悇绉嶈繍绠楅兘鏄互瀛楄妭浣滀负...
  • c++涓殑浣嶈繍绠璁$畻闂
    绛旓細鐒跺悗鎸変綅鍙栧弽锛屽緱锛1111111111111111111111111111110锛屾渶鍚庡啀鍔犱釜1锛屽氨鏄0xFFFFFFFF锛宎|b-c锛岃繖瑕佽冭檻鍒杩愮畻绗︾殑浼樺厛绾ч棶棰橈紝涔橀櫎姹備綑鐨勪紭鍏堢骇澶т簬鍔犳硶鍑忔硶锛屽姞娉曞噺娉曞ぇ浜庝笌杩愮畻锛屼笌杩愮畻澶т簬寮傛垨杩愮畻锛屽紓鎴栬繍绠楀ぇ浜庢垨杩愮畻锛岀幇鍦ㄥ啀鏉ョ湅浣犵殑闂锛宎|b-c锛氬厛鍋氬噺娉昩-c锛屽緱-1锛岀劧鍚庡啀涓1鍋氭垨杩愮畻锛屽緱鍒-1...
  • -63&0xFF 姹傝缁浣嶈繍绠杩囩▼
    绛旓細-63鏄礋鏁帮紝璐熸暟鍦ㄨ绠楁満涓敤鍏惰ˉ鐮佽〃绀 鎵浠-63鐨勮ˉ鐮佷负闄ょ鍙蜂綅鍏朵綑浣嶅彇鍙嶅悗鍔1锛-63鐨勮ˉ鐮佷负11000001 11000001&011111111=011000001=193
  • 绠鍗曠殑c璇█浣嶈繍绠閫夋嫨棰,姹傚ぇ绁璇﹁В,涓嶈儨鎰熸縺!鍙仛绗笁棰樺氨鍙互浜(^...
    绛旓細绗笁棰樻槸涓嶆槸鍗伴敊浜嗭紵濡傛灉x鍓嶉潰鏈墌绗︾殑璇濄傜瓟妗堝氨鏄疍銆
  • 鍒濆python缂栫▼瑕佹帉鎻″摢浜涘唴瀹?
    绛旓細PYTHON璇硶鍩虹 鍩虹鏁版嵁绫诲瀷锛屽彉閲忔湰璐紝绠鍗曞嚱鏁帮紝杈撳叆杈撳嚭鍑芥暟锛屽眬閮ㄥ彉閲忓拰鍏ㄥ眬鍙橀噺锛岀畻鏈〃杈惧紡锛岄昏緫琛ㄨ揪寮忥紝鍏崇郴琛ㄨ揪寮忥紝浣嶈繍绠锛岃娉曟牸寮忥紝鍒嗘敮璇彞锛屽惊鐜鍙ワ紝break锛宑ontinue锛宭ist鍒楄〃-澧炲垹鏀规煡鎴彇鎿嶄綔锛宼uple鍏冪粍-鏌ュ拰鎴彇鎿嶄綔锛宒ictionary瀛楀吀-澧炲垹鏀规煡鎿嶄綔锛屽嚱鏁伴珮绾э紝鍑芥暟鐨勫弬鏁璇﹁В锛屽嚱鏁扮殑璋冪敤鍏崇郴...
  • 本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网