移位與乘除法的關係
移位實現的乘除法比直接乘除的效率高很多。
用移位實現乘除法運算
a=a*4;
b=b/4;
可以改為:
a=a<<2;
b=b>>2;
說明:
除2 = 右移1位 乘2 = 左移1位
除4 = 右移2位 乘4 = 左移2位
除8 = 右移3位 乘8 = 左移3位
... ...
通常如果需要乘以或除以2的n次方,都可以用移位的方法代替。
大部分的C編譯器,用移位的方法得到程式碼比呼叫乘除法子程式生成的程式碼效率高。
實際上,只要是乘以或除以一個整數,均可以用移位的方法得到結果,如:
a=a*9
分析a*9可以拆分成a*(8+1)即a*8+a*1, 因此可以改為: a=(a<<3)+a
a=a*7
分析a*7可以拆分成a*(8-1)即a*8-a*1, 因此可以改為: a=(a<<3)-a
關於除法讀者可以類推, 此略.
一個自己曾經忽視的東西,那就是C/C++中的移位操作容易出錯的情況。
1、什麼樣的資料型別可以直接移位
char、short、int、long、unsigned char、unsigned short、unsigned int、unsigned long都可以進行移位操作,而double、float、bool、long double則不可以進行移位操作。
2、有符號資料型別的移位操作
對於char、short、int、long這些有符號的資料型別:
對負數進行左移:符號位始終為1,其他位左移
對正數進行左移:所有位左移,即 <<,可能會變成負數
對負數進行右移:取絕對值,然後右移,再取相反數
對正數進行右移:所有位右移,即 >>
3、無符號資料型別的移位操作
對於unsigned char、unsigned short、unsigned int、unsigned long這些無符號資料型別:
沒有特殊要說明的,使用<< 和 >> 操作符就OK了
結束語
8086 中存在邏輯移位、算術移位,而C/C++中的移位似乎既不是邏輯移位,也不是算術移位。
比如-1,我們若對它右移1位,C的結果仍舊是-1,事實上無論右移多少位始終是-1,邏輯移位得到的結果(8位表示)應該是-128,所以這點要注意
主要是看到PHP中HASH演算法用的是times33演算法,其思想是不斷乘以33,而給出的程式碼是hash<<5+hash代替hash*33,因為33=2的5次方(32)+1,所以相當於hash*2的5次方+hash*1,轉換為移位運算則是hash<<5+hash.
相關推薦
移位與乘除法的關係
移位實現的乘除法比直接乘除的效率高很多。 用移位實現乘除法運算 a=a*4; b=b/4; 可以改為: a=a<<2; b=b>>2; 說明: 除2 = 右移1位 乘2 = 左移1位 除4 = 右移2位 乘4 = 左移2位 除8
C/C++中移位實現乘除法運算
用移位實現乘除法運算 a=a*4; b=b/4; 可以改為: a=a<<2; b=b>>2; 說明: 除2 = 右移1位 乘2 = 左移1位 除4 = 右移2位
C/C++用移位實現乘除法運算,提高執行效率
用移位實現乘除法運算 a=a*4; b=b/4; 可以改為: a=a<<2; b=b>>2; 說明:除2 = 右移1位 乘2 = 左移1位 除4 = 右移2位 乘4 = 左
C/C++ 位移與乘除法的換算
使用位移運算可以提高因乘除運算帶來的效率的問題,它的缺點是存在精度損失且不直觀。 乘法 12 * 2 = 12 << 1 12 * 4 = 12 << 2 12 *
C語言中乘除法與移位關係
微控制器程式設計中移位運算比乘除法效率更高,當然用移位運算替代乘除法程式碼會有點晦澀。下面記錄下自己學習的內容以做備忘。 用移位實現乘除法運算 a=a*8; b=b/8; 可以改為: a=a<<3; b=b>>3; 說明: 除2 = 右移
計算機中移位操作和乘除法的關係
移位實現的乘除法比直接乘除的效率高很多。 用移位實現乘除法運算 a=a*4; b=b/4; 可以改為: a=a<<2; b=b>>2; 說明: 除2 = 右移1位 乘2 = 左移1位 除4 = 右移2位 乘4 = 左移2位 除8
使用移位運算子做乘除法運算
一個整數每次執行移位運算中的左運算n次,相當於這個整數乘以2的n次方; 一個整數每次執行移位運算中的右運算n次,相當於這個整數除以2的n次方; 不過這種方式只能用於乘以除以2的n次方,但是他的效率比乘法運算要高; public class Main { public
python之繼承中組合用法與菱形繼承關係查詢法
1.什麼是組合 組合就是一個類的物件具備某一屬性,該屬性的值是指向另外外一個類的物件2.為什麼用組合 組合也是用來解決類與類之間程式碼冗餘問題3.用法class Course: #組合 def __init__(self
數據結構與算法第10周作業——二叉樹的創建和遍歷算法
技術分享 truct order traverse eof 結構 後序遍歷 lib void 一、二叉樹的創建算法(遞歸方式) 二、二叉樹的先序、中序和後序遍歷算法 #include<stdio.h>#include<stdlib.h>typedef
Java與算法之(9) - 直接插入排序
set reat 正是 stat copy boa 派生 creat 人的 直接插入排序是最簡單的排序算法,也比較符合人的思維習慣。想像一下玩撲克牌抓牌的過程。第一張抓到5,放在手裏;第二張抓到3,習慣性的會把它放在5的前面;第三張抓到7,放在5的後面;第四張抓到4,那麽我
Java與算法之(8) - 堆排序
循環 public tar 最大 swap https rgs tool 技術分享 堆是一種特殊的完全二叉樹,其特點是所有父節點都比子節點要小,或者所有父節點都比字節點要大。前一種稱為最小堆,後一種稱為最大堆。 比如下面這兩個: 那麽這個特性有什麽作用?既然題目是堆排序,
Java與算法之(5) - 老鼠走迷宮(深度優先算法)
tail 數字化 boa pop ase lis ext oar tar 小老鼠走進了格子迷宮,如何能繞過貓並以最短的路線吃到奶酪呢? 註意只能上下左右移動,不能斜著移動。 在解決迷宮問題上,深度優先算法的思路是沿著一條路一直走,遇到障礙或走出邊界再返回嘗試別的路徑。 首
Java與算法之(7) - 完全二叉樹
itl 輸出 void 結構 ray 線性 net pop pbo 樹 下圖是一“棵”樹的樣子。樹這個名稱起的很形象,整個數據結構由根、枝、葉組成,其中1為根節點,2、3是1的子節點,4、5、6、8、9、10這幾個沒有子節點的節點稱為葉節點。 節點的度:一個節點的
Java與算法之(6) - 八皇後問題
tools trac ava height com 技術分享 false fis light 在8×8格的國際象棋上擺放八個皇後,使其不能互相攻擊,即任意兩個皇後都不能處於同一行、同一列或同一斜線上,問有多少種擺法。 (文字和圖片來自百度百科) 如果動手來擺放皇後,可以
對數幾率回歸法(梯度下降法,隨機梯度下降與牛頓法)與線性判別法(LDA)
3.1 初始 屬性 author alt closed sta lose cnblogs 本文主要使用了對數幾率回歸法與線性判別法(LDA)對數據集(西瓜3.0)進行分類。其中在對數幾率回歸法中,求解最優權重W時,分別使用梯度下降法,隨機梯度下降與牛頓法。 代碼如下:
垃圾回收的概念與算法
還要 無法 次數 回收算法 串行 引用 from 標記壓縮 高效 GC中的垃圾,是指的是在內存中不在不再被使用的對象。 常見的垃圾回收算法 1.引用計數算法(無法回收循環引用的對象) 2.標記清除算法分為標記階段和清除階段(會產生內存的空間碎片) 3.復制算法(缺點是將系統
數據結構與算法系列研究四——數組和廣義表
cout stdlib.h idt fcc 地址 space stream emp style 稀疏矩陣的十字鏈表實現和轉置 一、數組和廣義表的定義 數組的定義1:一個 N 維數組是受 N 組線性關系約束的線性表。 二維數組的邏輯結構可形式地描述
數據結構與算法系列研究三——字符串
ext 其他 pty 算法實現 strcmp images troy hide ryu 字符串的研究和KMP算法分析和實現 一、串的定義 串是計算機非數值處理的基本對象。串是一種特殊的線性表,它的每個結點僅由一個字符組成,並且單個元素是無意義的。 1、串(stri
《大數據日知錄:架構與算法》讀書筆記(多圖)
打通 導論 ges wid 技術分享 二次 思維 知識點 很好 第二次讀這本書,這次是精讀,畫了思維導圖。書很好,完整的知識結構和由淺入深的介紹,非常全面以至於知識點都梳理了三天。 作為導論式的總覽,對大數據領域有了個總體的認識,接下來可以更針對性地加強和實踐。 總體上
數據結構與算法系列研究九——排序算法的一些探討
停止 不同 位置 集合 完全 設置 img com 去除 四種排序 一.實驗內容 輸入20個整數,分別用希爾排序、快速排序、堆排序和歸並排序實現由小到大排序並輸出排序結果。二.關鍵數據結構與核心算法 關鍵數據結構:由於是排序為了簡單起見,選用線性表中的數組作為存