python基礎no 2 位運算

2021-10-08 10:19:20 字數 4649 閱讀 5455

感謝^^:

二進位制有三種不同的表示形式:原碼、反碼和補碼,計算機內部使用補碼來表示。

原碼:就是其二進位制表示(注意,最高位是符號位)。

00

000011-

>310

000011-

>

-3

反碼:正數的反碼就是原碼,負數的反碼是符號位不變,其餘位取反(對應正數按位取反)。

00

000011-

>311

111100-

>

-3

補碼:正數的補碼就是原碼,負數的補碼是反碼+1。

00

000011-

>311

111101-

>

-3

符號位:最高位為符號位,0表示正數,1表示負數。在位運算中符號位也參與運算。

~1=

0~0=

1

~num的補碼中的 0 和 1 全部取反(0 變為 1,1 變為 0)有符號整數的符號位在~運算中同樣會取反。

00

000101-

>5~

---11

111010-

>-6

1111

1011

->-5

~---

0000

0100

->

4

1&1

=11&

0=00

&1=0

0&0=

0

只有兩個對應位都為 1 時才為 1

00

000101-

>5&

0000

0110

->6-

--0000

0100

->

4

1|1

=11|

0=10

|1=1

0|0=

0

只要兩個對應位中有乙個 1 時就為 1

00

000101-

>5|

0000

0110

->6-

--0000

0111

->

7

1^1

=01^

0=10

^1=1

0^0=

0

只有兩個對應位不同時才為 1

00

000101-

>5^

0000

0110

->6-

--0000

0011

->

3

異或操作的性質:滿**換律和結合律

a:

0000

1100

b:00

0001

11a^b:

0000

1011

b^a:

0000

1011

a^a:

0000

0000a^0

:000011

00a^b^a:

= a^a^b = b =

0000

0111

num << inum的二進位制表示向左移動i位所得的值。

00

001011-

>

1111

<<3-

--0101

1000

->

88

num >> inum的二進位制表示向右移動i位所得的值。

00

001011-

>

1111

>>2-

--0000

0010

->

2

通過<<>>快速計算2的倍數問題。

n << 1 -> 計算 n*2

n >> 1 -> 計算 n/2,負奇數的運算不可用

n << m -> 計算 n*(2^m),即乘以 2 的 m 次方

n >> m -> 計算 n/(2^m),即除以 2 的 m 次方

1 << n -> 2^n

通過^快速交換兩個整數。

a ^

= bb ^

= aa ^

= b

通過a & (-a)快速獲取a的最後為 1 位置的整數。

00

0001

01->5&

1111

1011

->-5

---0000

0001

->100

0011

10->14&

1111

0010

->-14

---0000

0010

->

2

乙個數的二進位制表示可以看作是乙個集合(0 表示不在集合中,1 表示在集合中)。

比如集合,可以表示成01 00 01 10 10而對應的位運算也就可以看作是對集合進行的操作。

元素與集合的操作:

a | (1把 i 插入到集合中

a & ~(1把 i 從集合中刪除

a & (1判斷 i 是否屬於該集合(零不屬於,非零屬於)

集合之間的操作:

a 補   ->

~aa 交 b -> a & b

a 並 b -> a | b

a 差 b -> a &

(~b)

注意:整數在記憶體中是以補碼的形式存在的,輸出自然也是按照補碼輸出。

【例子】c#語言輸出負數。

class program

}

【例子】 python 的bin()輸出。

print

(bin(3

))# 0b11

print

(bin(-

3))# -0b11

print

(bin(-

3&0xffffffff))

# 0b11111111111111111111111111111101

print

(bin

(0xfffffffd))

# 0b11111111111111111111111111111101

print

(0xfffffffd

)# 4294967293

是不是很顛覆認知,我們從結果可以看出:

所以為了獲得負數(十進位制表示)的補碼,需要手動將其和十六進製制數0xffffffff進行按位與操作,再交給bin()進行輸出,得到的才是負數的補碼表示。

練習題

leetcode 習題 136. 只出現一次的數字

給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。

嘗試使用位運算解決此題。

題目說明:

"""

input file

example1: [2,2,1]

example2: [4,1,2,1,2]

output file

result1: 1

result2: 4

"""class

solution

:def

singlenumber

(self, nums: list[

int])-

>

int:

# your code here

def

singlenumber

(self,nums)

: i=

0for j in nums:

i^=j return i

總結:

python位運算基礎

位與 位或 位異或 左移 右移 求反作用 按位操作,兩個對應的位都為1,則結果為1,有乙個為0,則結果為0 示例 10 20 0b01010 0b10100 00000 bin x 函式 將x轉換為二進位制的字串 ps 有點像數學中的 作用 按位操作,兩個對應的位只要有乙個為1,則結果為1,否則為0...

Python語法規則No 2

usr bin python def func print 666 入口函式 if name main print 222 func 被呼叫函式 print name 例項化當前物件和定義的類是有區別如下 usr bin python coding utf 8 class mytest def in...

python 位運算 效能 Python位運算妙用

位運算就是直接對整數在記憶體中的二進位制位進行操作,位運算的效能較高,常用的位運算包含按位與 按位或 按位非 按位異或 有符號左移 如下是一些妙用的示例 判斷奇偶 常用思路通過除以2,判斷餘數是否為0 def isodd x return true if x 2 0 else false 如何使用位...