[ C 文章收集] Bitwise Operation - 程式扎記

文章推薦指數: 80 %
投票人數:10人

接下來要介紹位元運算的一些用途. Bitwise operator 介紹: * << SHIFT LEFT , >> ... 標籤 [英文學習] [計算機概論] [深入雲計算] [雜七雜八] [AlgorithminJava] [DataStructureswithJava] [IRClass] [Java文章收集] [Java代碼範本] [Java套件] [JVM應用] [LFDNote] [MangoDB] [MathCC] [MongoDB] [MySQL小學堂] [Python考題] [Python常見問題] [Python範例代碼] [心得扎記] [網路教學] [C常見考題] [C範例代碼] [C/C++範例代碼] [IntroAlg] [Java代碼範本] [Java套件] [Linux小技巧] [Linux小學堂] [Linux命令] [MLInAction] [ML] [MLP] [Postgres] [Python學習筆記] [QuickPython] [SoftwareEngineering] [Thepythontutorial] 工具收集 設計模式 資料結構 ActiveMQInAction AI Algorithm Android Ansible AWS BigData研究 C/C++ C++ CCDH CI/CD Coursera Database DB DesignPattern DeviceDriverProgramming Docker Docker工具 DockerPractice Eclipse EnglishWriting ExtJS3.x FP FraudPrevention FreeBSD GCC Git GitPro GNU Golang Gradle Groovy Hadoop Hadoop.HadoopEcosystem Java JavaFramework JavaUI JavaIDE JavaScript Jenkins JFreeChart Kaggle Kali/Metasploit Keras KVM LearnSpark LeetCode Linux Lucene Math ML MLUdemy MPI Nachos Network NLP nodejs OO OpenCL OpenMP OSC OSGi Pandas Perl PostgreSQL PyDS Python Python自製工具 PythonStdLibrary Pythontools QEMU R RealPython RIA RTC Ruby RubyPackages Scala ScalaIA SQLAlchemy TensorFlow Tools UML Unix Verilog Vmware Windows技巧 wxPython 2011年5月25日星期三 [C文章收集]BitwiseOperation 轉載自 這裡  前言:  歡迎來到二進位的世界。

電腦資料都是以二進位儲存,想當然程式語言的變數也都是以二進位儲存。

在C/C++當中有幾個位元運算子:<>SHIFTRIGHT、&AND、|OR、^XOR、~NOT,可以對變數進行位元運算。

接下來要介紹位元運算的一些用途.  Bitwiseoperator介紹:  *<>SHIFTRIGHT  這兩個運算子的功能主要是移動一個變數中的所有位元,位元向左/向右移動之後,最高位/最低位的位元會消失,最低位/最高位的位元補0.運算範例如下:  5<<1=10 //00101的全部位元向左移動一位數變成01010.  5<<2=20 //00101的全部位元向左移動兩位數變成10100.  5>>1=2 //00101的全部位元向右移動一位數變成00010.  5>>2=1 //00101的全部位元向右移動一位數變成00001. 在十進位當中,當全部位數向左移動一位時,數值大小會變成原來的十倍,向左移動兩位時,會變成原來的百倍.這種情形在二進位也是成立的,當全部位元向左移動一位時,會變成原來的兩倍,向左移動兩位時,會變成原來的四倍。

至於往右移動也是類似道理,變成了除法而已.由於電腦進行位元運算比乘法、除法運算快上許多,所以有很多專業的程式設計師,會利用位元運算來取代乘法、除法運算.優點是程式執行效率增加,缺點是程式碼可讀性變低. 範例如下:  viewplaincopytoclipboardprint?int n= 5;   n=n>> 1; //即是n=n/2之意。

   /*該式子也可寫成n>>=1或n/=2。

*/   *&AND  0&0=0 0&1=0 1&0=0 1&1=1& 的功能是將兩個變數對應的位元進行AND邏輯運算,然後產生新變數.&的特色,就是可以判斷出位元是不是1.例如我們想要數一個變數有幾個位元是1,則可以如下操作:  viewplaincopytoclipboardprint?int n= 19;  //待測數   int digit=sizeof(n)* 8; //待測數為幾位元.   int c= 0; //Counter   for(int i=0;i {       if(n&(1< }   printf("Result:%d\n",c);   *|OR  0|0=0 0|1=1 1|0=1 1|1=1| 的功能是將兩個變數對應的位元進行OR邏輯運算,然後產生新變數.其特色,就是把位元強制標記成1.例如我們想要把五位數標成1:  viewplaincopytoclipboardprint?int mark_5th_bit(int n)   {       return n|(1 <>31=111...111(如果x是負數)or000...000(如果x是正數)       //x^(x>>31)  =>如果x為負數則將x的0轉1,1轉0,如果x為正數,則保持x不變.       //(x^(x>>31))-(x>>31)=>如果x為正數則x-0=x,如果x為負數則~x-(-1)=-x         return (x^(x>> 31))-(x>> 31);   }   -最低位的位元1  viewplaincopytoclipboardprint?int lowest_bit_1(int x)   {       return x&-x;   }   -判斷一個整數是不是2的次方  viewplaincopytoclipboardprint?boolis_power_of_2(int x)   {       return (x&-x)==x;   }   -交換兩個int變數  viewplaincopytoclipboardprint?void swap(int&x, int&y)   {       x=x^y; //x'=x^y       y=x^y; //y'=x'^y=x^y^y=x       x=x^y; //x=x'^y'=x^y^x=y   }   -計算有幾個位元是1(32位元整數)  viewplaincopytoclipboardprint?int count_bits(int x)   {       x=(x& 0x55555555)+((x& 0xaaaaaaaa)>> 1);       x=(x& 0x33333333)+((x& 0xcccccccc)>> 2);       x=(x& 0x0f0f0f0f)+((x& 0xf0f0f0f0)>> 4);       x=(x& 0x00ff00ff)+((x& 0xff00ff00)>> 8);       x=(x& 0x0000ffff)+((x& 0xffff0000)>> 16);       return x;   }      int count_bits2(unsigned int n){       int i=0;       for (;n!= 0;n>>= 1)           if (n& 1)               ++i;       return i;   }   -顛倒位元順序(32位元整數)  viewplaincopytoclipboardprint?int reverse_bits(int x)   {       x=((x>> 1)& 0x55555555)|((x<> 2)& 0x33333333)|((x<> 4)& 0x0f0f0f0f)|((x<> 8)& 0x00ff00ff)|((x<> 16)& 0x0000ffff)|((x<>SHIFTRIGHT、&AND、... [VerilogTutorial]行為模型的敘述:always,if/else,case與forloop Preface: 在這個階層中,我們只需考慮電路模組的功能,而不需考慮其硬體的詳細內容.Verilog的時序控制為以事件為基礎的時序控制: * 接線或暫存器的值被改變。

* 模組的輸入埠接收到新的值* 正規... [Linux命令]du:顯示目錄或是檔案的大小 屬性: 系統相關-檔案與目錄 語法: du[參數][檔案] 參數|功能 -a|顯示目錄中個別檔案的大小-b|以bytes為單位顯示-c|顯示個別檔案大小與總和-D|顯示符號鏈結的來源檔大小-h|Hum...



請為這篇文章評分?