按位運算符以及位移運算探討

来源:http://www.cnblogs.com/pssp/archive/2016/09/02/5836018.html
-Advertisement-
Play Games

之前一直沒搞懂這個怎麼計算的,主要也因為之前沒怎麼用到過這個,但現在想把它搞懂,所以索性一次性搞懂為妙,以後就不用再糾結了哈。 按位運算符就是把數字看作二進位來進行計算的,並且再把計算出來的二進位給它轉換成十進位,也就是最終的結果了。 比如: 7&9 這個是按位與,先不討論與不與的,總之它現在會把7 ...


  之前一直沒搞懂這個怎麼計算的,主要也因為之前沒怎麼用到過這個,但現在想把它搞懂,所以索性一次性搞懂為妙,以後就不用再糾結了哈。

按位運算符就是把數字看作二進位來進行計算的,並且再把計算出來的二進位給它轉換成十進位,也就是最終的結果了。

 

比如:

   7&9

這個是按位與,先不討論與不與的,總之它現在會把7和9轉換成二進位,接下來我們將7和9轉換成2進位,這裡我用python。

如果你看不懂這段代碼沒有關係,因為這裡的重點不是講python,而是按位運算符,這裡我們可以看到7的二進位為111,而9的二進位為1001。明顯可以看出7和9的二進位長度不一樣,如果長度不一樣的話,短的那個前面會自動補0。結果就成了這樣:

 

7:0111

9:1001

前面說了所謂的按位運算符就是比較兩個數的二進位,那麼怎麼比較呢,是這樣的,如果是按位與那麼就比較兩個數是不是都為1如果是就是1否則為0,看下麵。

 

比如第一個7:0 ,第一個9:1那麼它們就為0,只要其中有一個是0那麼它就是零,當然這是對於按位於來說的。

 

整體比較如下:

7:0 1 1 1

9:1 0 0 1

結果:0 0 0 1

那麼結果二進位就成了0001了,那麼二進位0001再轉換成十進位就是1,自然7&9結果就是1。

我們可以用下麵的工具來幫我們轉換。

 

其他的東西都不要問我,我只說按位運算符,因為其他我啥也不懂,至於轉換來轉換去,我也是百度了一下的,但我的目的達到了,因為我不是來學進位轉換的,有一句話說的很好,不忘初心,方得始終。這也是一種學習方式,以前我學習老愛糾結這些,所以一直就學不好,因為有些根本就不是你現在該考慮的,你要明確自己學這個幹嘛。

 

那麼按位或,按位非,按位取反,自然也是一個道理,不過是比較的時候換種花樣罷了,再拿按位或來演示一下。

按位或

5|6

轉換2進位:

5:101

6:110

只要有1就是1

結果:111 這是二進位 再轉一下就是7.

 

我們來看看這個按位運算符有沒有什麼規律。

//轉成二進位

console.log((1).toString(2)); //1
console.log((2).toString(2)); //10
console.log((3).toString(2)); //11
console.log((4).toString(2)); //100
console.log((5).toString(2)); //101
console.log((6).toString(2)); //110

 

console.log(1&0); //0

console.log(1&1); //1

console.log(1&2); //0
console.log(1&3); //1
console.log(1&4); //0
console.log(1&5); //1
console.log(1&6); //0

 

這裡可以看出1&任何單數都為1,而1&任何雙數都為0。(包括負數)

 

console.log(2&0); //0
console.log(2&1); //0
console.log(2&2); //2
console.log(2&3); //2
console.log(2&4); //0
console.log(2&5); //0
console.log(2&6); //2
console.log(2&7); //2
console.log(2&8); //0
console.log(2&9); //0
console.log(2&10); //2
console.log(2&11); //2
console.log(2&12); //0
console.log(2&13); //0
console.log(2&14); //2
console.log(2&15); //2

 

這裡可以看出2的規律是0 0 2 2  可以口算出來的管理還真沒看出來。 

再看一組

console.log(3&0); //0
console.log(3&1); //1
console.log(3&2); //2
console.log(3&3); //3

console.log(3&4); //0
console.log(3&5); //1
console.log(3&6); //2
console.log(3&7); //3

console.log(3&8); //0
console.log(3&9); //1
console.log(3&10); //2
console.log(3&11); //3

console.log(3&12); //0
console.log(3&13); //1
console.log(3&14); //2
console.log(3&15); //3

console.log(3|0); //3
console.log(3|1); //3
console.log(3|2); //3
console.log(3|3); //3

console.log(3|4); //7
console.log(3|5); //7
console.log(3|6); //7
console.log(3|7); //7

console.log(3|8); //11
console.log(3|9); //11
console.log(3|10); //11
console.log(3|11); //11

console.log(3|12); //15
console.log(3|13); //15
console.log(3|14); //15
console.log(3|15); //15

規律隔4加4.

 

其他規律就不算了。

 

ok了,這是一次很愉快的過程,目的達到了哈,按位運算可以告一段落了。

 

位運算看了半天才看懂T_T ,下麵寫一下位運算的原理吧。

先拿右移>>運算開刷。

 

如:16>>2 = 4

它的計算是先將16轉成二進位,然後把這個二進位往右移動2個位置。

16的二進位:0001 0000

往右移動兩個就成了0000 0100,為什麼是移動兩個因為我們上面寫的就是2啊,>>後面表示的是你要移動多少位。實際上這裡我們還是看不懂,為什麼前面0001變成了0000了呢?是這樣的:

16>>2表示在16這個二進位前面添加兩個零或者兩個1,至於是添加零還是1取決於>>左邊的這個數是正數還是負數,如果是正數就填補0,如果是負數就填補1。

 

0001 0000

因為16是正數所以填補0

0000 0100 00 超出了兩個0去掉超出的,因此就是:

0000 0100

 

再如5>>3=0

5的二進位為:0000 0101

結果:0000 0000

 

那麼左移位呢?自然相反啊。

 

比如5<<3=40

5的二進位為:0000 0101

結果:0010 1000

啥意思?就是把0或者一往0000 0101後面補,然後把前面多餘的刪除。

000 0010 1000 前面三個0刪除。

 

反正就是這樣了,能不能聽懂你自己看著辦吧,就到這了。

 

網上看到這篇文章還是不錯的:http://www.cnblogs.com/yyangblog/archive/2011/01/14/1935656.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 紋理映射非常實用,在游戲場景中已經無所不在了. 一個較少的多邊形構成的模形,配合好的紋理貼圖進行映射,可以得到逼真的效果.游戲中的天空,地面,牆面,和植物都是紋理貼圖進行映射的. 例如最終幻想8的男女主角多邊形數量是非常少的,完全靠貼圖保證真實效果。 以前的游戲中的樹木其實就是一個四邊形加上樹木貼圖 ...
  • 想要使用OWA需要一臺單獨的伺服器來部署,這對很多人造成困難。而寫該文的目的是為了分享有個OWA的集成步驟,它不僅適用於.Net開發環境,其它語言也是一樣的,只要實現了需要的服務介面。並且該文不局限與OWA的研究,還包括Config、XML、Cache、Redis等技術。更重要的是熟悉.Net Co ...
  • 目錄索引 【無私分享:ASP.NET CORE 項目實戰】目錄索引 簡介 MyCat2.0版本很快就發佈了,關於MyCat的動態和一些問題,大家可以加一下MyCat的官方QQ群:106088787。我們今天主要介紹一下,在我們的Asp.net Core中如何使用Mycat,這源於一個大神(Amami ...
  • 1、本系統主要目的:1、實現電路圖線上設計及電路設備選型;2、對電路圖設計過程中涉及到的工程計算進行線上處理;3、對電路圖設計所涉及的相關數據可視化。 2、本系統實現前提:1、visio組件,傳統visio運用均是基於pc端本地visio軟體操作,無法滿足visio圖的實施共用性;2、web端是基於 ...
  • 本次介紹的是音樂播放器APlayer結合WebAPI的使用,先給各位看下效果: 上面就是APlayer的效果,然後這插件的地址是 https://github.com/DIYgod/APlayer 下麵是項目內容: APlayerAndWebApi是處理APlayer的,而WebAPI則是生成音樂列 ...
  • 我們來說一下Iqueryable集合和List等本地集合的區別,下麵我們通過建立一個簡單的例子來學習這個知識點,直接進入主題吧 1.首先對比一下兩段代碼?看一下有什麼結果: (1) 第一段代碼如圖所示: (2)第一段代碼使用資料庫的Profiler查看執行結果: (3)第二段代碼如圖所示: (4) ...
  • 材質顏色 OpenGL用材料對光的紅、綠、藍三原色的反射率來近似定義材料的顏色。象光源一樣,材料顏色也分成環境、漫反射和鏡面反射成分,它們決定了材料對環境光、漫反射光和鏡面反射光的反射程度。在進行光照計算時,材料對環境光的反射率與每個進入光源的環境光結合,對漫反射光的反射率與每個進入光源的漫反射光結 ...
  • 項目介紹:利用Qt實現簡單的學生信息管理 實現功能:實現對信息的添加,刪除,查詢,修改 廢話不多說,直接進入主題:(剛剛學,界面做的不是太美觀,請多包涵) 主界面 - mainWindow && login 一、添加學生 - 1、使用組件有:Dialog 視窗,Label標簽,Line Edit,S ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...