1. 程式人生 > >移位與乘除法的關係

移位與乘除法的關係

移位實現的乘除法比直接乘除的效率高很多。

用移位實現乘除法運算
  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個整數,分別用希爾排序、快速排序、堆排序和歸並排序實現由小到大排序並輸出排序結果。二.關鍵數據結構與核心算法 關鍵數據結構:由於是排序為了簡單起見,選用線性表中的數組作為存