BNUOJ 1065或運算的簡單解法

2022-04-28 14:48:12 字數 1217 閱讀 9026

接下來同一行有n個非負整數,每個數都不超過 2^16範圍。兩個數之間用空格分開。

2 18467 6334

思路:這道題目,必須感謝隊友劉慶的想法......

比如現在有n(n==3)個數,分別是:2                   5               7

將它們轉化為二進位制:    0010              0101         0111

那麼,現在只看二進位制,我們將這三個二進位制加起來,但不進製,只統計二進位制各個位上面的1的個數會得到:

1    1     1    1

0    2     2    2

這表示,二進位制第三位沒有1,第二位有2個1,第一位有2個1,第0位有2個1,這些位對應:2^3    2^2    2^1    2^0

那麼會發現當2|2+2|5+2|7==2*2^0+n*2^1+2*2^2+0*2^3

5|2+5|5+5|7==n*2^0+2*2^1+n*2^2+0*2^3

7|2+7|5+7|7==n*2^0+n*2^1+n*2^2+0*2^3

發現沒有,當乙個數,比如7的二進位制0111去或其他數的時候,若有一位本身是1,那麼這一位或上與之對應的那一位(不管是0還是1)形成的新的數字的這一位都會是1;

就比如000110   與010000  或  變成010110       ,會發現只要有1的位,所形成新的二進位制那一位也必然有1,那麼當它與n個二進位制數字或操作,所形成新的二進位制數字,當原數字有1那麼它對應的那一位也必然是1的.....這樣,我們就只需要統計所以的二進位制加起來不產生進製的情況下,每一位有多少個1就好 。

**:

#include#include#includeusing namespace std;

struct node

s[10005];

int t[20],f=0;

int p[20]=;

int main()

for(int j=0;j<=15;j++)

if(s[i].a[j]==1)

t[j]++;

//for(int i=0;i<=15;i++)

//printf("%d",t[i]);

}int ans=0;

for(int i=1;i<=n;i++)

if(s[i].a[j]==0)}}

printf("%d\n",ans);

}return 0;

}

異或運算 有趣的異或運算

異或運算可以看做是沒有進製的加法,按位異或運算,相同為0,不同為1。0 0 0 0 1 1 1 0 1 1 1 0 觀察運算結果我們發現,當與0做異或運算時,另一元值不變 而與1做異或運算時,另一元值值取反。根據以上異或運算的特徵,可以有以下用途,除方便直觀外,運算效能也更加優異。1 變數重置0 假...

異或運算的簡單加解密應用

xor運算的逆運算是它本身,也就是說兩次異或同乙個數最後結果不變,即 a xor b xor b a。xor運算可以用於簡單的加密,比如我想對我mm說1314520,但怕別人知道,於是雙方約定拿我的生日19880516作為金鑰。1314520 xor 19880516 20665500,我就把206...

負數的或運算

場景 有乙個函式的返回值是乙個狀態量,我希望用這個狀態量的每一位來表示一種狀態的t f。迫於強迫症,這個返回的值應該是負數的。所以一開始我大概是這樣寫的 if if yyy if zzz 但是這個結果一直是 1。原來以為負數的或運算和正數的或運算是一樣的,1 2 3這樣的。後來想了下,因為在計算機裡...