二進位制列舉

2022-06-26 18:21:13 字數 1346 閱讀 2450

二進位制列舉有啥用?

**短,比起dfs列舉還要快

怎麼列舉的?

比如你有三個物品,你只需要從0列舉到2^3-1=7就可以了(dfs列舉我就不說了)

為什麼呢?

0——7這幾個數的二進位制形式如下

0——000

1——001

2——010

3——011

4——100

5——101

6——110

7——111

你可以把1當作選這個物品,0代表不選這個物品。每乙個位置上對應乙個物品的選擇

什麼意思呢?

就比如2——010

我們就可以定義從左到右第乙個位置對應1號物品的選與不選,從左到右第二個位置對應2號物品的選與不選,從左到右第三個位置對應3號物品的選與不選

那麼2——010代表的意義就是第乙個物品不選,第二個物品要選,第三個物品不選

而且從0——7的每乙個數都具有這樣的意義。那麼可以說從0——(2^n)-1(n代表n個物品)這樣列舉,這號可以把所有狀態列舉到

一些位運算子

按位與運算子(&)

參加運算的兩個資料,按二進位制位進行「與」運算。

運算規則:0&0=0;  0&1=0;   1&0=0;    1&1=1;

即:兩位同時為「1」,結果才為「1」,否則為0

例如:3&5  即 0000 0011& 0000 0101 = 00000001  因此,3&5的值得1。

左移運算(<<)

a << b就表示把a轉為二進位制後左移b位(在後面添b個0)。例如100的二進位制為1100100,而110010000轉成十進位制是400,那麼100 << 2 = 400。可以看出,a << b的值實際上就是a乘以2的b次方,因為在二進位制數後添乙個0就相當於該數乘以2(這樣做要求保證高位的1不被移出)。

通常認為a << 1比a * 2更快,因為前者是更底層一些的操作。因此程式中乘以2的操作請盡量用左移一位來代替。

除了左移還有右移,右移代表除2(只保留整數部分)

a>b   代表:a的二進位制形式向右移動了b個位置,相當於除了b個2

**:

1 #include 2

3using

namespace

std;45

intmain()67

2829}30

31 printf("\n"

);3233}

3435

return0;

3637 }

二進位制列舉

fliptile 乙個反轉問題,大意是一頭牛要反轉木板,木板有黑和白,全部翻成白色的反法 輸出。小蒟蒻根本想不到 參考了大佬的部落格。點此轉入 把第一行的全部翻法都試一遍,然後看哪種的步數最少。好難想。include include int maze 20 20 int t 20 20 int f ...

二進位制列舉

一 二進位制操作 算數字運算 a 60 0011 1100 b 13 0000 1101 1.與 兩個二進位制數,同 1為 1,否則為 0。a b 12 0000 1100 2.或 兩個二進位制數,同 0為 0,否則為 1。a b 61 0011 1101 3.非 按位取反 對二進位制每一位進行了一...

二進位制列舉

讓我們從乙個題目入手 從乙個大小為n的整數集中選取一些元素,使得它們的和等於給定的值t。每個元素限選一次,不能乙個都不選。關於這個題目,我們很容易想到的便是對所有元素進行暴力搜尋,然後進行剪枝便可。下面我將介紹二進位制列舉的思路和流程來巧妙的解決這個問題。對任一數來說,所面臨的問題是取或不取,在二進...