python中不同进制的整数之间可以直接运算_Python 进制转换、位运算
一、進制轉換
編程用十進制,十進制轉換為二進制、八進制、十六進制
In [135]: bin(23)
Out[135]: '0b10111'
In [136]: oct(23)
Out[136]: '0o27'
In [137]: hex(23)
Out[137]: '0x17'
也可以直接反向獲取十進制
In [146]: 0b10111
Out[146]: 23
In [147]: 0o27
Out[147]: 23
In [148]: 0x17
Out[148]: 23
也可以用int函數來轉換
In [149]: int('0b10111', 2)
Out[149]: 23
In [150]: int('0o27', 8)
Out[150]: 23
In [151]: int('0x17', 16)
Out[151]: 23
二、位運算
按位異或的3個特點:
(1) 0^0=0,0^1=1 0異或任何數=任何數
(2) 1^0=1,1^1=0 1異或任何數-任何數取反
(3) 任何數異或自己=把自己置0
按位異或的幾個常見用途:
(1) 使某些特定的位翻轉
例如對數10100001的第2位和第3位翻轉,則可以將該數與00000110進行按位異或運算。
10100001^00000110 = 10100111
(2) 實現兩個值的交換,而不必使用臨時變量
例如交換兩個整數a=10100001,b=00000110的值,可通過下列語句實現:
a = a^b; //a=10100111
b = b^a; //b=10100001
a = a^b; //a=00000110
& 按位與
| 按位或
^ 按位異或
~ 按位取反
<< 按位左移
>> 按位右移
用途: 直接操作二進制,省內存,效率高
1)<<按位左移
各二進位全部左移n位,高位丟棄,低位補0
x << n 左移 x 的所有二進制位向左移動n位,移出位刪掉,移進的位補零
【注意事項】
a. 左移1位相當于乘以2
用途:快速計算一個數乘以2的n次方 (8<<3 等同于8*2^3)
b.左移可能會改變一個數的正負性
2)>>右移
各二進位全部右移n位,保持符號位不變
x >> n, x的所有二進制位向右移動n位,移出的位刪掉,移進的位補符號位, 右移不會改變一個數的符號
【注意事項】
右移1位相當于除以2
x 右移 n 位就相當于除以2的n次方
用途:快速計算一個數除以2的n次方 (8>>3 等同于8/2^3)
3)& 按位與
全1才1否則0 :只有對應的兩個二進位均為1時,結果位才為1,否則為0
4) | 按位或
有1就1 只要對應的二個二進位有一個為1時,結果位就為1,否則為0
5) ^ 按位異或
不同為1 當對應的二進位相異(不相同)時,結果為1,否則為0
6) ~ 取反
~9 = -10
【為什么9取反變成了-10的說明】:
9的原碼 ==> 0000 1001 因為正數的原碼=反碼=補碼,所以在 真正存儲的時候就是0000 1001
接下來進行對9的補碼進行取反操作
進行取反==> 1111 0110 這就是對9 進行了取反之后的補碼
既然已經知道了補碼,那么接下來只要轉換為 咱們人能識別的碼型就可以,因此按照規則 ,把這個1111 0110 這個補碼 轉換為原碼即可
符號位不變,其它位取反==> 1000 1001
三、例題
1. 輸入一個正數,輸出該數二進制表示中1的個數
知識點:把一個整數減去1,再和原整數做與運算,會把該整數最右邊一個1變成0。那么一個整數的二進制表示中有多少個1,就可以進行多少次這樣的操作。
總結:把一個整數減去1之后再和原來的整數做位與運算,得到的結果相當于是把整數的二進制表示中的最右邊一個1變成0 。
代碼如下:
def count(n):
num = 0
while n:
n &= (n-1)
num += 1
return num
2. 輸入兩個整數m和n,計算需要改變m的二進制表示中的多少位才能得到n
解決方法:第一步,求這兩個數的與或;第二步,統計異或結果中1的位數。
代碼如下:
def mton(m,n):
yihuo = m^n
count = 0
while yihuo:
yihuo &= (yihuo-1)
count += 1
print(count)
3. 用一條語句判斷一個整數是不是2的整數次方
解決方法:一個整數如果是2的整數次方,那么它的二進制表示中有且只有一位是1,而其它所有位都是0 。根據前面的分析,把這個整數減去1后再和它自己做與運算,這個整數中唯一的1就變成0了。
代碼如下:
def judgebinary(x):
if x&(x-1) == 0:
return True
return False
4.不使用運算符 + 和 - ???????,計算兩整數 ???????a 、b ???????之和
示例:
示例 1:
輸入: a = 1, b = 2
輸出: 3
示例 2:
輸入: a = -2, b = 3
輸出: 1
代碼如下:
def getSum(a, b):
"""
:type a: int
:type b: int
:rtype: int
"""
#位操作
no_carry_sum=a^b #a與b不進位時的和,恰好與異或性質一樣
print(no_carry_sum)
carry=(a&b)<<1 #a與b的和的進位,恰好是與或操作再左移一位
print(carry)
return sum([no_carry_sum,carry])#前兩者之和
res = getSum(12,3)
print(res)
總結:兩個數的和可以通過將這兩個數異或得到這個數不進位時的和,再將這兩個數進行與或再左移一位,相當于進位的操作,再將這兩個數相加,就可以得到兩個數的和
5.判斷數字n的二進制數從右往左數第i位是否為1
思路:1<
用n與有特定位的指示數與或,就能判斷n的特定位是否為1,【長數和短數與或只比較到短數的長度】
舉例:10的二進制數倒數第2位是否為1, 10--1010, 1<<1=2--10, 1010&10 = True
代碼如下:
def isOne(n,i):
print(n,1<
return (n&(1<
res = isOne(10,1)
print(res) #True
參考文獻:
總結
以上是生活随笔為你收集整理的python中不同进制的整数之间可以直接运算_Python 进制转换、位运算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 兵马末动下一句是什么呢?
- 下一篇: 不孕不育的人会排卵吗