閱讀筆記 0x01 位運算

2022-09-02 01:54:08 字數 1443 閱讀 7113

1.補碼表示:~x=-1-x

2.自然溢位:unsigned long long 自動對2^32取模,可以用來hash

3.基本位運算操作:

左移:1<

n<<1=2n,n<<2=4n,n<<3=8n。。。

算術右移:n>>1=n/2 ,n>>4=n/16。。。算術右移=除以2向下取整 e.g. (-3) >> 1 = -2,3>>1=1

p.s. 整數/2 = 除以2向0取整 e.g. (-3)/2=-1 , 3/2=1

tips:以下二進位制以0為最低位,即k從0開始。

取出整數n在二進位制下的第k位:(n>>k)&1

取出整數n在二進位制下的第0~k-1位(後k位):n&((1<

把整數n在二進位制表示下的第k位取反:n^(1<

把整數n在二進位制表示下的第k位賦值為1:n|(1<

把整數n在二進位制表示下的第k位賦值為0:n&(~(1<

以上常用於把乙個n維bool陣列壓縮成乙個n維二進位制整數,即狀態壓縮,常用於狀壓dp

注意符號的運算優先順序:加減(+ -)>移位(>> <<)>比較大小(> < == !=)>位與(&)>異或(^)>位或(|)

可以直接每個運算子都加乙個括號來提高正確性。

成對變換:n為偶數 n^1=n+1 ; n為奇數 n^1=n-1 so「0 1」,「2 3」構成成對變換,常用於存圖中的邊與其反向邊。

lowbit: lowbit(x)=x&-x 返回x在二進位制表示下的最低位的1及其後面的0構成的數值。是樹狀陣列的核心。

4.快速冪 o(logn)

#include#include

#include

using

namespace

std;

typedef

long

long

ll;int

main()

printf(

"%lld

",mul%p);

return0;

}

5.64位整數乘法 o(logn)

#include#include

#include

using

namespace

std;

typedef

long

long

ll;int

main()

printf(

"%lld

",mul%p);

return0;

}

0x01 基本演算法 位運算

題目描述 求 a 的 b 次方對 p 取模的值,其中 0 a,b,p 10 9 輸入描述 三個用空格隔開的整數a,b和p。輸出描述 乙個整數,表示a b mod p的值。例項 輸入 2 3 9 輸出 8 思路 這道題是要先算出a的b次冪再對其結果進行求模 取餘 因為b最大可為1e 9,按普通做法來做...

演算法高階 0x01 位運算

一 快速冪的模板 a b p includeusing namespace std intmain cout 注意點 1 轉換成long long型別可以直接乘1ll,作用與 long long 相同,範圍大概為10 19,int為2 147 483 647。2 以2 7為例,7 4 2 2 2 2...

Python精選閱讀 0x01期

用各種generator iterator descriptor等黑魔法,加上各種函式程式設計方法的使用,python總能使用很短的 完成很複雜的事情,下面集中放一些這方面的文章 本文將簡單講述一下 python 探針的實現原理。這裡的探針是指通過import hook,sitecustomize....