Python這些位運算的妙用,絕對讓你大開眼界

位運算的性能大家想必是清楚的,效率絕對高。相信愛好源碼的同學,在學習閱讀源碼的過程中會發現不少源碼使用了位運算。但是為啥在實際編程過程中應用少呢?想必最大的原因,是較為難懂。不過,在面試的過程中,在手寫代碼過程中,寫出一兩個位運算的代碼,還會讓面試官眼前一亮的。

位運算常用的運算符包括&(按位與), | (按位或),~(按位非),^(按位異或),<< (有符號左移位) ,>>(有符號右移位)。

下面用幾個例子說明其應用,希望對你有所啟發。

1、判斷奇數還是偶數

通常判斷奇數還是偶數我們想到的辦法就是除以2,看余數是否為0。

Python代碼如下:

def isodd(x):return True if (x % 2 <> 0) else False
復制代碼

如何使用位運算呢?

我們只需要使用&運算,與1進行&,如果為1,那么該數為奇數;如果為0,那么該數是偶數,Python代碼如下:

def isodd(x):return True if (x & 1) else False
復制代碼

2、左移一位相當于乘以2,右移一位相當于除以2

在面試的過程中,通常會遇到的一個問題是寫二分查找代碼。

二分查找的代碼如下:

def binary_search(list, item):''':param list: 有序列表:param item: 要查找的元素:return: item在list中的索引,若不在list中返回None'''low = 0high = len(list) - 1while low <= high:midpoint = (low + high) // 2if list[midpoint] == item:return midpointelif list[midpoint] < item:low = midpoint + 1elif list[midpoint] > item:high = midpoint - 1return None
復制代碼

其中有一步是需要取最小小標和最大下標的中間值,若使用位運算符,midpoint = (low + high) >> 1,面試官肯定會對你刮目相看。

3、交換兩個數值

數值交換的代碼相信大家都非常熟悉了,因為似乎是從學編程語言的最開始就一直用:

temp = b
b = a
a = temp
復制代碼

但是怎么使用位運算來完成此功能呢?

a ^= b
b ^= a
a ^= b
復制代碼

確實比較難理解,原理是什么呢?

第一行,a = a ^ b,很容易理解;

第二行, b = b ^ a = b ^ a ^ b,由于 b ^ b = 0,所以 b = a ^ 0,即 b = a;

第三行, a = a ^ b ,由于a在第一步重新賦值,所以,a = a ^ b ^ a = b,完成了數值交換。

這里,總結下異或運算的特性:任意數和自身異或結果為0;0和任意數異或結果還是其本身。

4、尋找數據列表中的獨一無二

有一個數據列表(2N+1個整數),只有一個數出現了1次,其余N個數都出現了2次。如何找到這個獨一無二的數據?

看到這個題目,相信大家第一次想到的算法肯定是計數,建立列表,循環整個數據并計數,然后遍歷這個列表找到出現次數為1的數據。

這樣,空間復雜度為O(N)。

如何降低空間復雜度呢?

注意看一下剛剛講過的異或的特性:任意數和自身異或結果為0;0和任意數異或結果還是其本身。

那么,出現了2次的N個數異或的結果是0,再與出現次數為1次的數異或的結果即為該數。即:找到這個獨一無二數據的辦法是通過對全部的數據進行異或操作,空間復雜度降低為O(1)。

5、計算一個數值的二進制數中有多少個1

相信有了之前的基礎,大家很容易實現這個算法。單純的通過位運算,與1進行與運算,看是否結果為1,然后右移1位,繼續判斷。Python代碼實現如下:

def number1Bit(x):count = 0while x:count = count + (x&1)x = x >> 1return count
復制代碼

這樣存在一個問題,就是如果有連續多個0,那么需要做多次移位操作。有沒有簡單的方式跳過連續多個0的情況?

那就是通過與(x-1)進行&運算。這里可能不太好理解,舉例說明一下

x 1110 0000
x - 1 1101 1111
x&(x-1) 1100 0000
復制代碼

通過這種方式,會把最后的那個1檢測出來。

Python代碼實現如下:

def number1Bit(x):count = 0while x:count = count + 1x = x & (x-1)return count
復制代碼

總結:

1、與運算通常應用的場景是獲取某一位的值為1還是0(如判斷奇數偶數,統計數值中1的個數);

2、左移右移特性:左移一位相當于乘以2,右移一位相當于除以2;

3、異或特性:任意數和自身異或結果為0;0和任意數異或結果還是其本身。

大家有什么想說的,歡迎留言哈!更多關于Python的學習教程也會定期為大家更新!


轉載于:https://juejin.im/post/5d0afa5ee51d455071250b2a

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/274928.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/274928.shtml
英文地址,請注明出處:http://en.pswp.cn/news/274928.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

記一次 Vue2 遷移 Vue3 的實踐總結

大家好&#xff0c;我是若川。持續組織了6個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列一、V…

改錯3-38

#include<iostream.h>class time{private:int hour,minute,second;public:void settime(int h,int m,int s) { hour(h>0&&h<24)?h:0; minute(m>0&&m<60)?m:0; second(s>0&&s<60)?s:0; }void sh…

魔獸懷舊網站模塊下載_一個人的網站重新設計和懷舊

魔獸懷舊網站模塊下載Despite how I look, I’m the kind kind of person that loves to play old video games. (Full disclosure: I look exactly like the kind of person that loves to play old video games).盡管我長得很帥&#xff0c;但我還是一個喜歡玩舊視頻游戲的人…

華為架構師談如何理解運用模塊與微服務

模塊化還是微服務&#xff1f; 我們的業務由一個大型應用轉向微服務的時候&#xff0c;除了很好展示漂亮的PPT&#xff0c;提升KPI之外&#xff0c;實際操作時將整個業務切成微型服務似乎也不費吹灰之力。但這種方法真的是我們的最佳選擇嗎&#xff1f;確實&#xff0c;維護凌亂…

Node.js 可以和 Web 實現 HTTP 請求的跨平臺兼容了!

大家好&#xff0c;我是若川。持續組織了6個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列大家好…

zeplin加載 不出圖片_為什么Zeplin不能解決您的所有問題

zeplin加載 不出圖片Design handover involves communicating the visual styles and behaviours of your design so they can be translated into code.設計移交涉及傳達設計的視覺樣式和行為&#xff0c;以便可以將它們轉換為代碼。 Back in the Dark Ages of digital desig…

POJ 基礎數學

數學 組合數學 POJ3252,poj1850,poj1019,poj1942 數論 poj2635, poj3292,poj1845,poj2115 計算方法&#xff08;二分&#xff09; poj3273,poj3258,poj1905,poj3122 組合數學 poj 3252 題意&#xff1a;如果一個數是round number&#xff0c;則它的二進制表示中&#xff…

使用uwsgi和gunicorn部署Django項目

https://uwsgi-docs.readthedocs.io/en/latest/Management.html https://uwsgi-docs.readthedocs.io/en/latest/Management.html 先了解下相關殺進程命令 ps -ef|grep uwsgi|grep -v grep|awk {print $2}|xargs kill -9//查看uwsgi相關接口 ps -ef|grep uwsgi #查看相關端口 ne…

推薦2022前端必看的新書 《Vue.js設計與實現》

大家好&#xff0c;我是若川。持續組織了6個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列這本新…

漢堡菜單_漢堡菜單-可訪問性和用戶體驗設計原則的挑戰?

漢堡菜單重點 (Top highlight)I was recently designing a hamburger menu for a client and before I knew it, I had embarked on this journey where I was reading article after article about the accessibility issues which accompany a hamburger icon. Turns out, th…

Server2012R2 ADFS3.0 The same client browser session has made '6' requests in the last '13'seconds

本問題是在windows server2012R2系統ADFS3.0環境下遇到的&#xff0c;CRM2013部署ADFS后運行一段時間(大概有一兩個月)后在IE瀏覽器中訪問登陸界面點擊登陸后就報以下錯誤 “Microsoft.IdentityServer.Web.InvalidRequestException: MSIS7042: The same client browser session…

(原創)RHEL/CentOS 5.x使用yum快速安裝MySQL 5.5.x

PS&#xff1a;MySQL 5.5系列成為穩定版已經有一段時間了&#xff0c;但據我調查了解&#xff0c;在生產環境中還是以5.1系列為主。在國內的大公司里&#xff0c;只確定金山在使用5.5了。 公司的其中幾臺廣告統計服務器&#xff0c;之前的運維直接用了自帶安裝的MySQL 5.0系列。…

又一個基于 Esbuild 的神器!esno

大家好&#xff0c;我是若川。持續組織了6個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan02 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列esno我…

c# ui 滾動 分頁_UI備忘單:分頁,無限滾動和“加載更多”按鈕

c# ui 滾動 分頁重點 (Top highlight)When you have a lot of content, you have to rely on one of these three patterns to load it. So, which is best? What will your users like? What do most platforms use? These are the questions we will explore today.當內容…

1.20(設計模式)模板模式

模板模式&#xff0c;定義了一個模板&#xff0c;模板內容通過子類實現模板的抽象方法去添加。 就類似學校需要建一個新校區&#xff0c;新校區有多棟宿舍&#xff0c;找了多個施工方&#xff0c;每個施工方負責一棟宿舍樓。 各個施工方都有自己的想法&#xff0c;建造的宿舍樓…

少年,看你異于常人,有空花2小時來參加有3000人的源碼共讀嘛~

大家好&#xff0c;我是若川。按照從易到難的順序&#xff0c;前面幾期&#xff08;比如&#xff1a;validate-npm-package-name、axios工具函數&#xff09;很多都只需要花2-3小時就能看完&#xff0c;并寫好筆記。但收獲確實很大。開闊視野、查漏補缺、升職加薪。已經有400筆…

HDU 3488 KM

http://acm.hdu.edu.cn/showproblem.php?pid3488 依然KM&#xff0c; 可以最小費用流 與HDU1853 差不多&#xff0c;但是1853要判斷是否滿足回路的的條件&#xff0c;KM還不會判回路&#xff0c;所以做1853時學了最小費用流做的&#xff0c;說是學最小費用流 只是皮毛了。。…

Java 面向對象的程序設計(二)

編寫一個java程序&#xff0c;設計一個汽車類Vehicle&#xff0c;包含的屬性有車輪的個數wheels和車重weight。小汽車類Car是Vehicle的子類&#xff0c;包含的屬性有載人數loader。卡車類Truck是Car類的子類&#xff0c;其中包含的屬性有載重量payload。每個類都有構造方法和輸…

16位調色板和32位調色板_使調色板可訪問

16位調色板和32位調色板Accessibility has always been a tough sell. Admittedly, less so than in the ‘nineties, when no prospective client was interested. But even today — more enlightened times — the majority of companies I encounter still prefer to make …

從零開始發布自己的NPM包

大家好&#xff0c;我是若川。持續組織了6個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan02 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列在Ver…