50212. Bits Swapping
難度:3/51
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <ctype.h>
int cnt_1(int arr[], int start, int finish){
int cnt = 0;
for(int i = start; i < finish; i++){
if(arr[i] == 1) cnt++;
}
return cnt;
}
void x(int arr[], int start, int finish){
if(start + 1 == finish) return;
int mid = (start + finish) / 2;
int cnt = cnt_1(arr, start, finish);
if(cnt % 2 == 1){
for(int i = start, j = mid; i < mid; i++, j++){
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
x(arr, start, mid);
x(arr, mid, finish);
}
int main(){
uint32_t n;
scanf("%u", &n);
int arr[32] = {0};
for(int i = 0; i < 32; i++){
arr[i] = ((n >> 31 - i) & 1);
}
x(arr, 0, 32);
uint32_t f = 0;
for(int i = 0; i < 32; i++){
if(arr[i] == 1){
f |= ((uint32_t)1 << (31 - i));
}
}
printf("%u\n", f);
}