感謝^^:
二進位制有三種不同的表示形式:原碼、反碼和補碼,計算機內部使用補碼來表示。
原碼:就是其二進位制表示(注意,最高位是符號位)。
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 << i
將num
的二進位制表示向左移動i
位所得的值。
00
001011-
>
1111
<<3-
--0101
1000
->
88
num >> i
將num
的二進位制表示向右移動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 如何使用位...