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