版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第第頁C語言中位運算的使用技巧位運算
程序中的所有數(shù)在計算機內(nèi)存中都是以二進制的形式儲存的。位運算就是直接對整數(shù)在內(nèi)存中的二進制位進行操作
位操作的優(yōu)勢
位運算是一種底層的運算,往往比普通的運算要快上許多許多
位運算是最高效而且占用內(nèi)存最少的(算法)操作,執(zhí)行效率非常高
位運算操作的是二進制數(shù),會擁有一些二進制的特性,在實際問題可以方便運用
位運算只需較低的空間需求
位運算使用能使程序變得更加簡潔和優(yōu)美
位運算可以表示一些狀態(tài)集合
運算符號
下面的a和b都是整數(shù)類型,則:
含義(C語言)按位與areturn(n}
取余,(除數(shù)為2的n次方)
//得到余數(shù)intYu(intnum,intn){inti=1
指定二進制位數(shù)截取
比如說16位二進制數(shù)A:1001100110011000,如果想獲A的哪一位的值,就把數(shù)字B:0000000000000000的那一位設(shè)置為1。
比如想獲得A的第三位就把B的第三位數(shù)字設(shè)置為1,則B為0000000000000100,設(shè)置完之后再把A、B求與,其結(jié)果若為0,說明A的第三位為0,其結(jié)果為1,說明A的第三位為1。
同理:若要獲得A的第五位,就把B設(shè)置為0000000000010000,之后再求與。
通常在程序中,數(shù)字B被稱為掩碼,其含義是專門用來測試某一位是否為0的數(shù)值。
統(tǒng)計二進制中1的個數(shù)
利用x=xwhile(x){sum++;x=x}returnsum;}
or操作
生成組合編碼,進行狀態(tài)壓縮
當把二進制當作集合使用時,可以用or操作來增加元素。合并編碼在對字節(jié)碼進行加密時,加密后的兩段bit需要重新合并成一個字節(jié),這時就需要使用or操作。
求一個數(shù)的二進制表達中0的個數(shù)
intGrial(intx){intcount=0;while(x+1){count++;x|=(x+1);}returncount;}
xor操作
兩個整數(shù)交換變量名
voidswap(intb^=a;a^=b;}
判斷兩個數(shù)是否異號
intx=-1,y=2;boolf=((x^y)
數(shù)據(jù)加密
將需要加密的內(nèi)容看做A,密鑰看做B,A^B=加密后的內(nèi)容C。而解密時只需要將C^密鑰B=原內(nèi)容A。如果沒有密鑰,就不能解密!
#include#include#include#defineKEY0x86intmain(){charp_data[16]={"HelloWorld!"};charEncrypt[16]={0},Decode[16]={0};inti;for(i=0;i
數(shù)字判重
利用了二進制數(shù)的性質(zhì):x^y^y=x。由此可見,當同一個數(shù)累計進行兩次xor操作,相當于自行抵銷了,剩下的就是不重復(fù)的數(shù)
找出沒有重復(fù)的數(shù)
intfind(int[]arr){inttmp=arr[0];for(inti=1;i
not操作
交換符號
intreversal(inta){return~a+1;}
取絕對值(效率高)
n>>31取得n的符號
若n為正數(shù),n>>31等于0
若n為負數(shù),n>>31等于-1
若n為正數(shù)n^0=0,數(shù)不變
若n為負數(shù),有n^-1需要計算n和-1的補碼,然后進行異或運算,結(jié)果n變符號并且為n的絕對值減1,再減去-1就是絕對值
intabs(intn){return(n^(n>>31))-(n>>31);}
也可以這樣使用
intabs(intn){inti=n>>31;returni==0?n:(~n+1);}
從低位到高位.將n的第m位置1
將1左移m-1位找到第m位,得到000...1...000,n在和這個數(shù)做或運算
intsetBitToOne(intn,intm){returnn|(1
同理從低位到高位,將n的第m位置0,代碼如下
intsetBitToZero(intn,intm){returnn}
shl操作a=(a>>8)|(a
進行二進制逆序
unsignedshorta=34520;a=((aa=((aa=((aa=((a
獲得int型最大最小值
intgetMaxInt(){return(1
m的n次方
//自己重寫的pow()方法intpow(intm,intn){intsum=1;while(n!=0){if(n}m*=m;n=n>>1;}returnsum;}
找出不大于N的最大的2的冪指數(shù)
intfindN(intn){n|=n>>1;n|=n>>2;n|=n>>4;n|=n>>8//整型一般是32位,上面我是假設(shè)8位。return(n+1)>>1;}
二分查找32位整數(shù)的前導(dǎo)0個數(shù)
intnlz(unsignedx){intn;if(x==0)return(32);n=1;if((x>>16)==0){n=n+16;x=x>24)==0){n=n+8;x=x>28)==0){n=n+4;x=x>30)==0){n=n+2;x=x>31);returnn;}
位圖的操作
將x的第n位置1,可以通過x|=(x
將x的第n位清0,可以通過x
取出x的第n位的值,可以通過(x>>n)
如下:
#defineclr_bit(x,n)((x)&=~(1>(n))&1)
綜合應(yīng)用
以下僅列出,感興趣可以參考下面鏈接:/~seander/bithacks.html
關(guān)于操作計數(shù)方法
計算整數(shù)的符號
(檢測)兩個整數(shù)是否具有相反的符號
計算無分支的整數(shù)絕對值(abs)
計算兩個整數(shù)的最小值(最小值)或最大值(最大值),而無需分支
確定整數(shù)是否為2的冪
標志延伸
從恒定位寬擴展的符號
從可變位寬擴展的符號
通過3個操作從可變位寬擴展符號有條件地設(shè)置或清除位而不分支
有條件地否定一個值而不分支
根據(jù)掩碼合并兩個值中的位
計數(shù)位設(shè)置
計數(shù)位設(shè)置,幼稚的方式
計算由查找表設(shè)置的位
數(shù)位集,BrianKernighan的方式
使用64位指令對14、24或32位字中設(shè)置的位進行計數(shù)
并行設(shè)置計數(shù)位
從最高有效位到給定位置的計數(shù)位的設(shè)置(等級)
從給定的計數(shù)(等級)中選擇位位置(從最高有效位開始)
計算奇偶校驗(如果設(shè)置了奇數(shù)位數(shù),則為1,否則為0)
天真地計算單詞的奇偶性
通過查找表計算奇偶校驗
使用64位乘法和模數(shù)除法計算字節(jié)的奇偶校驗
用乘法計算單詞的奇偶校驗
并行計算奇偶校驗
交換價值
用減法和加法交換值
用XOR交換值
用XOR交換單個位
反轉(zhuǎn)位序列
反轉(zhuǎn)位是顯而易見的方式
逐字查找表中的位反轉(zhuǎn)
通過3個操作(64位乘法和模數(shù)除法)反轉(zhuǎn)字節(jié)中的位
通過4個操作反轉(zhuǎn)字節(jié)中的位(64位乘法,無除法)
通過7個操作反轉(zhuǎn)字節(jié)中的位(無64位,僅32位)
與5*lg(N)個運算并行地反轉(zhuǎn)N位數(shù)量
模數(shù)除法(又名計算余數(shù))
在不進行除法運算的情況下,將模數(shù)除以1<<s(顯而易見)
在不進行除法運算的情況下以(1<<s)-1計算模數(shù)除法
不進行除法運算就并行計算(1<<s)-1的模數(shù)除法
查找整數(shù)的整數(shù)對數(shù)2(又稱最高位集的位置)
使用O(N)運算找到MSBN設(shè)置為整數(shù)的對數(shù)2(顯而易見的方法)
查找具有64位IEEE浮點數(shù)的整數(shù)的整數(shù)對數(shù)2
使用查找表找到整數(shù)的對數(shù)2
在O(lg(N))運算中找到N位整數(shù)的對數(shù)2
使用乘法和查找在O(lg(N))操作中找到N位整數(shù)的對數(shù)2
查找整數(shù)的對數(shù)以10為底的整數(shù)
查找整數(shù)的整數(shù)對數(shù)10
查找32位IEEE浮點數(shù)的整數(shù)對數(shù)基數(shù)2
查找32位IEEE浮點的pow(2,r)根的整數(shù)對數(shù)基數(shù)2(對于無符號整數(shù)r)
計算連續(xù)的尾隨零位(或查找位索引)
線性計算右邊的連續(xù)零位(后綴)
并行計算右側(cè)連續(xù)的零位(后綴)
通過二進制搜索計算右邊連續(xù)的零位(跟蹤)
通過強制轉(zhuǎn)換為浮點數(shù)來計算右側(cè)連續(xù)的零位(跟蹤)
用模數(shù)除法和查找計算右邊連續(xù)的零位(跟蹤)
用乘法和查找計數(shù)右邊連續(xù)的零位(后跟)
通過浮法舍入到2的下一
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 上海市重點建設(shè)項目社會穩(wěn)定風險評估報告編制指南
- 四年級數(shù)學(xué)(上)計算題專項練習(xí)及答案匯編
- 海島雷達塔玻璃鋼接閃桿 耐腐蝕玻璃纖維燈桿監(jiān)控桿 場變放電避雷針
- 釀酒制酒知識培訓(xùn)課件
- 春節(jié)汽車市場解析
- 2025版建筑工程施工現(xiàn)場環(huán)境保護資金投入保障合同3篇
- 中國衛(wèi)星網(wǎng)絡(luò)集團有限公司介紹
- 二零二五年度房產(chǎn)交易資金監(jiān)管居間合同3篇
- 從《西游記》到《黑神話:悟空》:孫悟空的游戲形象變遷與跨媒介敘事
- 以愛之名反對歧視
- 《榜樣9》觀后感心得體會二
- 暖通工程合同
- 生產(chǎn)型企業(yè)規(guī)章管理制度(3篇)
- 鋼結(jié)構(gòu)之樓承板施工方案流程
- 2024年營銷部工作人員安全生產(chǎn)責任制(2篇)
- ISO 56001-2024《創(chuàng)新管理體系-要求》專業(yè)解讀與應(yīng)用實踐指導(dǎo)材料之3:4組織環(huán)境-4.1理解組織及其環(huán)境(雷澤佳編制-2025B0)
- 2024-2030年中國管道檢測工程行業(yè)前景分析發(fā)展規(guī)劃研究報告
- 新的護理交班模式
- 2024年安徽省高校分類對口招生考試數(shù)學(xué)試卷真題
- 2024電影數(shù)字節(jié)目管理中心招聘歷年高頻難、易錯點練習(xí)500題附帶答案詳解
- 棋牌室消防應(yīng)急預(yù)案
評論
0/150
提交評論