位運算 異或運算

2021-10-01 23:39:36 字數 1759 閱讀 2180

今天刷題時遇到乙個題,本以為是暴力+大模擬,結果看完別人的ac**後人都傻了,竟然是位運算。其中用到了異或^這種運算子。

先上原題連線 :傳送門

題目意思很好理解,有無限多個路燈,編號為1.2.3…剛開始時都是關著的,每次對一盞燈的操作都會改變它的狀態(即開變成關,關變成開)。每次操作會給你乙個實數a和乙個整數b,一次操作是一次從1到b的k次迴圈,編號為a*k的實數部分的燈會改變狀態。問,最後剩下的燈的編號為多少。

這是個很簡單的模擬+暴力題,因為資料保證不超過2e6,所以我也用暴力的方法ac了

暴力ac**:

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

int ans;

int tong[

2000005];

intmain()

for(

int i =

1; i <=

2000005

; i++)if

(tong[i]

)return0;

}

接下來介紹主角——按位異或運算(^)

先介紹一下異或運算(^)的概念和用法

按位異或運算將兩個運算分量的對應位按位遵照以下規則進行計算:

0 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0

即相應位的值相同的,結果為 0,不相同的結果為 1。

例如,2^6結果為4

因為2表示為二進位制為0010,6表示為二進位制為0110

兩數只有第三位相異,因此最後的結果為0100,即為4

了解了異或運算的用法,我們接下來可以看題了。

首先我們要清楚,任意乙個數a異或同乙個數兩次後值依舊為a,比如7^3,結果為4,4^3後,結果為仍然為7,這剛好與燈的兩種狀態對應,即對一盞燈做偶數次操作,該燈狀態不變。

最後,該題保證n次操作完後只有一盞燈亮,其實這是這題能使用異或運算的先決條件。因為這樣就說明雖然有很多操作,但是兩兩抵消之後,只剩下乙個操作,該操作對應的編號^0之後的值還是該燈的編號。也就是最後唯一開著的那盞燈。

上ac**:

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

int ans;

intmain()

cout << ans << endl;

return0;

}

異或 位運算

powered by ab in 局外人 題意 求兩個陣列每個數之間的異或和。如果要o n 2 o n 2 o n2 遍歷,資料範圍很大,肯定會t tt。那麼就要想個別的辦法。我們可以統計分別 a aa,b bb 陣列每一位 0,1 0,10,1 個 數,分別計算每位的貢獻即可。如何實現?inclu...

位運算 異或

通俗的說異或,即指兩值相異時,取真值,否則為假。以下是其真值表 x y y 0 1 x 001 110那麼如何用與或非實現呢?既然是相異,當然首先想到 x y,看看它的真值表 x y01 0001 10有乙個位子有點不一樣,如果換一下 x 和 y 的位置呢?y x01 0011 00哦,這下很清楚了...

位運算之異或運算

位運算是基於整數的二進位制表示進行的運算。位運算總共只有5種運算 與 或 異或 左移 右移 異或運算 維基百科中對 異或 的解釋 在邏輯學中,邏輯算符異或 exclusive or 是對兩個運算元的一種邏輯析取型別,符號為 xor 或 eor 或 程式語言中常用 但與一般的邏輯或不同,異或算符的值為...