位運算問題

位運算

  位運算是把數字用二進制表示之后,對每一位上0或者1的運算。

  理解位運算的第一步是理解二進制。二進制是指數字的每一位都是0或者1.比如十進制的2轉化為二進制之后就是10。在程序員的圈子里有一個流傳了很久的笑話,說世界上有10種人,一種人知道二進制,而另一種人不知道二進制。。。。。。

  其實二進制的運算并不是很難掌握,因為位運算總共只有5種運算:與、或、異或、左移、右移。如下表:

與(&)0 & 0 = 01 & 0 = 00 & 1 = 01 & 1 = 1
或(|)0 | 0 = 01 | 0 = 10 | 1 = 11 | 1 = 1
異或(^)0 ^ 0 = 01 ^ 0 = 10 ^ 1 = 11 ^ 1 = 0

左移運算

  左移運算符m<<n表示吧m左移n位。左移n位的時候,最左邊的n位將被丟棄,同時在最右邊補上n個0.比如:

00001010 << 2 = 0010100010001010 << 3 = 01010000

右移運算

  右移運算符m>>n表示把m右移n位。右移n位的時候,最右邊的n位將被丟棄。但右移時處理最左邊位的情形要稍微復雜一點。這里要特別注意,如果數字是一個無符號數值,則用0填補最左邊的n位。如果數字是一個有符號數值,則用數字的符號位填補最左邊的n位。也就是說如果數字原先是一個正數,則右移之后再最左邊補n個0;如果數字原先是負數,則右移之后在最左邊補n個1.下面是堆兩個8位有符號數作右移的例子:

00001010 >> 2 = 0000001010001010 >> 3 = 11110001

補充:

? ? ? 右移運算x>>k的行為有點微妙。一般而言,及其支持兩種形式的右移:邏輯右移和算術右移。邏輯右移在左端補k個0;算術右移是在左端補k個最高有效位的值。

? ? ? c語言標準并沒有明確定義應該使用哪種類型的右移。對于無符號數據(也就是以限定詞unsigned聲明的整型對象),右移必須是邏輯的。而對于有符號數 據(默認的聲明的整型對象),算術的或者邏輯的右移都可以。但是,這也意味著任何假設一種或者另一種右移形式的代碼都存在潛在著可移植性問題。實際上,幾 乎所有的編譯器/機器組合都對有符號數據使用算術右移,并且我們一般都假設機器會使用這種右移(算術右移)。

?

? ? ? ?關于移位的運算有這樣的等價關系:把整數右移一位和把整數除以2在數學上是等價的。

a << = 1 ; //a左移一位等效于a = a * 2;

a << = 2 ; //a左移2位等效于a = a * 2的2次方(4);

?  計算機內部只識別1、0,十進制需變成二進制才能使用移位運算符<<,>> 。

int j = 8;
p = j << 1;
cout<<p<<endl;

  在這里,8左移一位就是8*2的結果16 。

  移位運算是最有效的計算乘/除乘法的運算之一

  按位與(&)其功能是參與運算的兩數各對應的二進制位相與。只有對應的兩個二進制位均為1時,結果位才為1,否則為0 。參與運算的數以補碼方式出現。

先舉一個例子如下:

  題目:請實現一個函數,輸入一個正數,輸出該數二進制表示中1的個數。

復制代碼
1 int count(BYTE n)
2 {
3 int num = 0; 4 while(n){ 5 n &= (n - 1); 6 num++; 7  } 8 return num; 9 }
復制代碼

  這里用到了這樣一個知識點:把一個整數減去1,再和原整數做與運算,會把該整數最右邊一個1變成0 。 那么一個整數的二進制表示中有多少個1,就可以進行多少次這樣的操作。

  總結:把一個整數減去1之后再和原來的整數做位與運算,得到的結果相當于是把整數的二進制表示中的最右邊一個1變成0 。

位運算的應用可以運用于很多場合:

  1. 清零特定位(mask中特定位置0,其它位為1 , s = s & mask)。
  2. 取某數中指定位(mask中特定位置,其它位為0, s = s & mask)。

舉例:輸入兩個整數m和n,計算需要改變m的二進制表示中的多少位才能得到n。

解決方法:第一步,求這兩個數的異或;第二步,統計異或結果中1的位數。

復制代碼
 1 #include<iostream>
 2 using namespace std;
 3  4 int main()  5 {  6 int a = 10 , b =13 , count = 0;  7 int c;  8 c = a ^ b;  9 while(c){ 10 c &= (c - 1); 11 count++; 12  } 13 cout<<count<<endl; 14 15 return 0; 16 }
復制代碼

?

?接下來我們再舉一例,就可以更好的說明移位運算了:用一條語句判斷一個整數是不是2的整數次方。

解決方法:一個整數如果是2的整數次方,那么它的二進制表示中有且只有一位是1,而其它所有位都是0 。 根據前面的分析,把這個整數減去1后再和它自己做與運算,這個整數中唯一的1就變成0了。

解答:!(x & (x - 1))

?

轉載于:https://www.cnblogs.com/13224ACMer/p/4613436.html

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

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

相關文章

conda環境管理介紹

我們可以使用conda 來切換不同的環境&#xff0c;主要的用法如下&#xff1a; 1. 創建環境 # 指定python版本為2.7&#xff0c;注意至少需要指定python版本或者要安裝的包 # 后一種情況下&#xff0c;自動安裝最新python版本conda create -n env_name python2.7# 同時安裝必…

unable to execute dex: multiple dex files Cocos2dxAccelerometer

原文轉載&#xff1a;http://discuss.cocos2d-x.org/t/conversion-to-dalvik-format-failed-unable-to-execute-dex-multiple-dex-files-define-lorg-cocos2dx-lib-cocos2dxaccelerometer/6652/4 用cocos2dx2.2.3沒問題&#xff0c;用了3.1.1出現這個問題。確實夠蛋疼。還要有這…

PHP javascript 值互相引用(不用刷新頁面)

PHP javascript 值互相引用的問題 昨天通過EMAIL給一些公司投了簡歷&#xff0c;希望他們能給我一份工作&#xff0c;今天其中一家公司的人給我打電話&#xff0c;大意是要我做一點東西&#xff08;與AJAX有關&#xff09; 給他們看&#xff0c;我聽打電話的人問我的問題&#…

mysql自增_面試官:為什么 MySQL 的自增主鍵不單調也不連續?

為什么這么設計(Why’s THE Design)是一系列關于計算機領域中程序設計決策的文章&#xff0c;我們在這個系列的每一篇文章中都會提出一個具體的問題并從不同的角度討論這種設計的優缺點、對具體實現造成的影響。如果你有想要了解的問題&#xff0c;可以在文章下面留言。當我們在…

caffe 初學參考鏈接

最近在學習caffe&#xff0c;也搜集了一些資料&#xff0c;主要是一些網上公開的博客資源&#xff0c;現匯總一下&#xff0c;以便后面參考。 caffe 安裝 編譯py-faster-rcnn全過程caffe依賴庫安裝&#xff08;非root&#xff09;編譯py-faster-rcnn的問題匯總及解決方法 ca…

java timer 定時任務

監聽類1 package com.xx.model;2 3 import java.util.Calendar;4 import java.util.Date;5 import java.util.Timer;6 import javax.servlet.ServletContextEvent;7 import javax.servlet.ServletContextListener;8 import org.apache.commons.logging.Log;9 import org.apache…

python 打開txt_在python中從txt文件打開鏈接

我想請求一個rss程序的幫助。我所做的是收集包含我項目相關信息的網站&#xff0c;然后檢查它們是否有rss提要。鏈接存儲在txt文件中(每行一個鏈接)。因此&#xff0c;我有一個txt文件&#xff0c;其中包含了需要檢查rss的基本url。在我找到了這個代碼&#xff0c;這會使我的工…

IOS-awakeFromNib和viewDidLoad

awakeFromNib 當.nib文件被加載的時候&#xff0c;會發送一個awakeFromNib的消息到.nib文件中的每個對象&#xff0c;每個對象都可以定義自己的 awakeFromNib函數來響應這個消息&#xff0c;執行一些必要的操作。也就是說通過nib文件創建view對象是執行awakeFromNib 。 viewDid…

使用過濾統計信息解決基數預估錯誤

基數預估是SQL Server里一顆隱藏的寶石。一般而言&#xff0c;基數預估指的是&#xff0c;在查詢編譯期間&#xff0c;查詢優化器嘗試找出在執行計劃里從各個運算符平均返回的行數。這個估計用來驅動計劃本身生成并選擇正確的計劃運算符——例如像Nested Loop, Merge Join,還是…

faster-rcnn系列學習之準備數據

如下列舉了 將數據集做成VOC2007格式用于Faster-RCNN訓練的相關鏈接。 RCNN系列實驗的PASCAL VOC數據集格式設置 制作VOC2007數據集用于Faster-RCNN訓練 將數據集做成VOC2007格式用于Faster-RCNN訓練 這一篇比較詳細地介紹了如何制造voc2007的所有文件&#xff0c;內含相關軟件…

C# 委托鏈、多路廣播委托

委托鏈、多路廣播委托&#xff1a;也就是把多個委托鏈接在一起,我們把鏈接了多個方法的委托稱為委托鏈或多路廣播委托 例&#xff1a; 1 class HelloWorld2 {3 //定義委托類型4 delegate void DelegationChain();5 static void Main(string[] args)6 …

openssl 生成證書_使用證書和私鑰導出P12格式個人證書!

【OpenSSL】使用證書和私鑰導出P12格式個人證書1, 產生CA證書1.1, 生成ca的私鑰openssl genrsa -out cakey.pem 20481.2, 生成ca的自簽名證書請求openssl req -new -key cakey.pem -subj "/CNExample Root CA" -out cacsr.pem1.3, 自簽名ca的證書openssl x509 -req -…

PHP (20140505)

數據庫表與表之間的連接是用id聯系。 join on&#xff1b;轉載于:https://www.cnblogs.com/sunshine-c/p/3710283.html

py-faster-rcnn代碼roidb.py的解讀

roidb是比較復雜的數據結構&#xff0c;存放了數據集的roi信息。原始的roidb來自數據集&#xff0c;在trian.py的get_training_roidb(imdb)函數進行了水平翻轉擴充數量&#xff0c;然后prepare_roidb(imdb)【定義在roidb.py】為roidb添加了一些說明性的屬性。 在這里暫時記錄下…

python 概率分布_python實現概率分布

伯努利分布from scipy import statsimport numpy as npimport matplotlib.pyplot as pltxnp.arange(0,2,1)xarray([0, 1])# 求對應分布的概率&#xff1a;概率質量函數 (PMF)p0.5# 硬幣朝上的概率dfstats.bernoulli.pmf(x,p)dfarray([0.5, 0.5])#繪圖vlines用于繪制豎直線(vert…

CodeForces 7D Palindrome Degree 字符串hash

題目鏈接&#xff1a;點擊打開鏈接 #include<stdio.h> #include<iostream> #include<string.h> #include<set> #include<vector> #include<map> #include<math.h> #include<queue> #include<string> #include<stdlib…

程序清單8-9 回送所有命令行參數和所有環境字符串

1 /*2 3 Name : test.c4 Author : blank5 Version :6 Copyright : Your copyright notice7 Description : 程序清單8-9 回送所有命令行參數和所有環境字符串8 9 */ 10 11 #include "ourhdr.h" 12 13 int main(int argc, char *argv[]) 14…

SQL快速入門

關系化數據庫保存關系模式數據的容器關系模式是對業務對象實體&#xff0c;屬性以及關系的抽象&#xff0c;提煉需求的名詞是建立實體關系模型常用的方法。要了解E-R實體關系圖的繪制。常用關系數據庫Microsoft SQL Server&#xff1b;微軟公司產品&#xff0c;中等規模數據庫&…

Faster RCNN minibatch.py解讀

minibatch.py 的功能是&#xff1a; Compute minibatch blobs for training a Fast R-CNN network. 與roidb不同的是&#xff0c; minibatch中存儲的并不是完整的整張圖像圖像&#xff0c;而是從圖像經過轉換后得到的四維blob以及從圖像中截取的proposals&#xff0c;以及與之對…

oracle精簡版_使用Entity Framework Core訪問數據庫(Oracle篇)

前言哇。。看看時間 真的很久很久沒寫博客了 將近一年了。最近一直在忙各種家中事務和公司的新框架 終于抽出時間來更新一波了。本篇主要講一下關于Entity Framework Core訪問oracle數據庫的采坑。。強調一下&#xff0c;本篇文章發布之前 關于Entity Framework Core訪問oracl…