接下來同一行有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這樣的。後來想了下,因為在計算機裡...