1. 程式人生 > >C語言效能優化——使用位運算

C語言效能優化——使用位運算

使用位操作可以減少除法和取模的運算。在計算機程式中資料的位是可以操作的最小資料單位,理論上可以用“位運算”來完成所有的運算和操作。一般的位操作是用來控制硬體的,或者進行資料變換,但是,靈活的位操作可以有效地提高程式執行的效率。例如:
//方法G
int I,J;
I = 257 /8;
J = 456 % 32;
 
//方法H
int I,J;
I = 257 >>3;
J = 456 - (456 >> 4 << 4);
在字面上好像方法H比方法G麻煩了好多,但是,仔細檢視產生的彙編程式碼就會明白,方法G呼叫了基本的取模函式和除法函式,既有函式呼叫,還有很多彙編程式碼和暫存器參與運算;而方法H則僅僅是幾句相關的彙編,程式碼更簡潔,效率更高。當然,由於編譯器的不同,可能效率的差距不大,但是,以目前遇到的MS C、ARM C來看,效率的差距還是不小的。

使用位操作可以減少除法和取模的運算。在計算機程式中資料的位是可以操作的最小資料單位,理論上可以用“位運算”來完成所有的運算和操作。一般的位操作是用來控制硬體的,或者進行資料變換,但是,靈活的位操作可以有效地提高程式執行的效率。例如:
//方法G
int I,J;
I = 257 /8;
J = 456 % 32;
 
//方法H
int I,J;
I = 257 >>3;
J = 456 - (456 >> 4 << 4);
 
在字面上好像方法H比方法G麻煩了好多,但是,仔細檢視產生的彙編程式碼就會明白,方法G呼叫了基本的取模函式和除法函式,既有函式呼叫,還有很多彙編程式碼和暫存器參與運算;而方法H則僅僅是幾句相關的彙編,程式碼更簡潔,效率更高。當然,由於編譯器的不同,可能效率的差距不大,但是,以目前遇到的MS C、ARM C來看,效率的差距還是不小的。

i++;
i = i + 1;

i++和++i的區別

在內建函式型別的情況下,效率沒有區別;在自定義資料型別情況下,++i效率更高,原因如下:

後置++的語義中總是存在一個臨時物件,這一點很重要,否則在過載一個類的後置++運算的時候容易搞錯。

i++總要建立一個臨時物件,在退出函式時還要銷燬它,而且返回臨時物件的值時還會呼叫並拷貝結構函式

相關推薦

C語言效能優化——使用運算

使用位操作可以減少除法和取模的運算。在計算機程式中資料的位是可以操作的最小資料單位,理論上可以用“位運算”來完成所有的運算和操作。一般的位操作是用來控制硬體的,或者進行資料變換,但是,靈活的位操作可以有效地提高程式執行的效率。例如: //方法G int I,J; I = 2

C語言中的運算

        在很多系統程式中常要求在位(bit)一級進行運算或處理。C語言提供了位運算的功能, 這使得C語言也能像組合語言一樣用來編寫系統程式。━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 操作符 作用 ────────────────────────────

CC++ 利用運算優化整數乘法

對於大多數計算機而言,整數乘法要比整數加法、減法、位運算慢,通常是一個量級的差別。在這個前提下,對整數乘法用加法、減法、位運算替代,通常可以提高效能。 自《深入理解計算機系統》 由於整數乘法比移位和加法的代價要大得多,許多C 語言編譯器試圖以移位、加法和減法的組合來消除

牛客練習賽 23 C 托米的運算

結束 syn color with bre bsp get class .com 鏈接:https://www.nowcoder.com/acm/contest/156/C來源:牛客網 托米完成了1317的上一個任務,十分高興,可是考驗還沒有結束 說話間1317給了托米 n

C程式碼效能優化總結

轉自:https://blog.csdn.net/chenyq991/article/details/79047741 1、優化程式碼框架 個人覺得程式碼架構對效能的影響至關重要,就好骨架之於人,所以我把這個放在第一點。舉個簡單的例子: 優化前: void main() { whi

C# http 效能優化500毫秒到 60 毫秒

偶然發現 C# 的 HttpRequest 要比 Chrome 請求同一Url 慢好多。C# HttpRequest 要500毫秒 而Chrome 只需要 39ms。 作為有責任感的 碼農。這個 必須優化。。 後來 整理 各種方法做了優化  HttpWebRequest request

C語言中的運算子主要有哪些?邏輯右移與算術右移的區別?

邏輯右移與算術右移的區別? 邏輯右移就是不考慮符號位,右移一位,左邊補零即可。 算術右移需要考慮符號位,右移一位,若符號位為1,就在左邊補1,;否則,就補0。 所以算術右移也可以進行有符號位的除法,右移n位就等於除2的n次方。 例如,8位二進位制數11001101分別右移一位。 邏輯

C語言中的模運算-hdu6124(打表,找規律)

題目連結:https://vjudge.net/problem/HDU-6124 題目描述: 題目大意就是給你一個數,判斷這個數 % 其它數後共有幾種結果。 這題對我來說最大的難點是我不太知道每個數 餘 其他的數應該得出什麼結果,後來參考了別人的部落格,才弄清楚了。現在我就舉一些例子來說明一下:

c語言16進制輸出

#include<stdio.h> void main() { char a[10]={0}; char i=0; unsigned char b=0xf4; for(i=0;i<10;i++) { a[i]=i

c語言-10進制字串轉16進制字串

程式碼: #include <stdio.h> #include <string.h> #include <malloc.h> char *DecToHex(char *pHex,char *pDec,int Declen) { int

C語言 16進制與ascii碼互轉

/*把ASCII字元轉換為16進位制 */ uint8_t char_to_hex(const uint8_t *ch) { uint8_t value = 0; if(*ch >= 0 && *ch <= 9

C語言 double int float 運算

原創 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <stdbool.h> void  main( ) {          

C語言之賦值運算中型別轉換的陷阱!

    在用C編寫微控制器的程式時,在採集處理資料時,總會出現一些不正常的資料。經過數次的排查,發現大部分的問題都出現在賦值時的型別轉換問題上。C語言在賦值時的型別轉換問題是很隱蔽的,經常性地會被忽略,而這又會導致致命性的錯誤。弄清楚C語言的型別轉換的規則,至關重要!

C語言 指標 詳解 二 C語言指標變數的運算

指標變數儲存的是地址,本質上是一個整數,可以進行部分運算,例如加法、減法、比較等,請看下面的程式碼: #include <stdio.h>int main(){ int a = 10, *pa = &a, *paa = &a;

學習C語言中的操作

最近在寫程式時,我需要判斷一個DWORD 型別變數的某一個二進位制位是否為1或0, 我們都很清楚,DWORD型別的變數在記憶體中佔32位,現在要我們判斷其中的某一位是0還是1, 該如何是好呢?這時我想到了C語言中的位操作,藉助位操作,可以實現我們想要的功能。關於位操作,我從

c語言實現24彩色影象二值化

// huiduhua.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include<stdio.h> #include<windows.h> int _tmain(int argc, _TCHAR*

C語言,進制轉換之十六進制轉二進位制,完整程式碼

#include "iostream" using namespace std; #define MAX 50 int main()//十六轉二 { int elem2[MAX]; char elem16[MAX]; cout <

c 語言實現24bmp圖片載入,讀寫,放大縮小 .

發現好多人網上查詢c 語言版本的bmp影象讀取,儲存,放大,縮小程式,很難找到完整的。 現在將自己寫的貼出來 供大家學習參考交流。轉載請標明出處,尊重作者勞動成果。 /**********************************************************            

C語言一些關於操作符的小練習

1.程式設計實現: 兩個int(32位)整數m和n的二進位制表達中,有多少個位(bit)不同? 輸入例子: 1999 2299 輸出例子:7 #include <stdio.h>

c語言中的操作

1.位操作符 (1)位與&: 真值表:1&0=0 1&1=1 0&0=0 0&1=0 從真值表可以看出:位與操作的特點是,