一个数组除了一个元素只出现一次,其他元素全都出现了三次,输出出现一次的元素
一个数组除了一个元素只出现一次,其他元素全都出现了三次,输出出现一次的元素
左移位就是比如二进制 0000 1011 左移一位就是 0001 0110,相当于乘2
右移位类似, 0000 1011 右移一位就是 0000 0101,相当于除2 (去掉了最低位)
1 #include <stdio.h> 2 #define N 10 3 int main() 4 { 5 int a[N] = {222,115,810,100,115,810,222,222,810,115}; 6 int i, j, count, len = 8 * sizeof(int), p = 1, n = 0; 7 // 对每个元素的每个二进制位进行累加,int 型有二进制位 32位 8 for(i = 0; i < len; i ++) //对每个数的每一位分别累加 9 { 10 count = 0; 11 for(j = 0; j < N; j ++) 12 { 13 // 若元素已为 0,那跳过,直接进行下一个元素运算 14 if(a[j] == 0) 15 { 16 continue; 17 } 18 // 对每个二进制位进行累加 19 count = count + ((a[j]) & 1); 20 // 将元素右移一位,为下次循环做准备 21 a[j] = a[j] >> 1; 22 } 23 // 只出现一次的元素的二进制位都是 3的余数 24 n = n + p * (count % 3); 25 p = p * 2; 26 } 27 printf("%d\n", n); 28 return 0; 29 }