deck:: Logseq/coding tip

- ## **► 비트연산 XOR(배타적 논리합)**
	- **기호** : {{c1 ^}}
	  id:: 6960ba6a-cbcf-48e0-ba15-39f4e3dbc76a
	- **연산값 :** (0, 0) -> {{c1 0}}, (0, 1) -> {{c1 1}}, (1, 0) -> {{c1 1}}, (1, 1) -> {{c1 0}}
	  extra:: 같으면 0, 다르면 1
	  id:: 6960baa5-ffe5-4782-ad1c-a75e7c3f25e8
	- **핵심성질 3가지** #card
	  id:: 6960bada-97e7-4f50-8cf7-1d1af57983b2
		- 같은 값 끼리 연산하면 0이 된다.
		  extra:: a ^ a = 0
		- 0과 연산하면 자기 자신이 된다.
		  extra:: a ^ 0 = a
		- 교환법칙, 결합법칙이 성립한다.
		  extra:: a ^ b = b ^ a, (a ^ b) ^ c = a ^ (b ^ c)
	- **활용**
		- 임시변수(temp) 없이 두 변수의 값을 swap #card
		  id:: 6960bbba-cf88-4072-ac55-c6edc540749a
			- ```c
			  int a = 3;
			  int b = 5;
			  
			  a = a^b;
			  b = a^b;
			  a = a^b;
			  // a = 5, b = 3
			  ```
		- 중복되는 수들의 배열에서 중복되지 않는 하나의 숫자를 찾을 때
			- 사용가능한 조건 #card
			  id:: 6960bc58-3189-4ec8-9554-cfa526027fb7
				- 모든 숫자들 중 단 한개를 제외한 모든 수가 중복되는 수 일 때
				- 중복되는 숫자들이 각각 짝수개로 존재하고 있으면서 찾으려는 숫자는 1개 혹은 홀수개가 존재할 경우
			- 다음 코드의 출력결과는?
			  id:: 6960bc99-5059-4e25-bd9f-502967918f5c
			  ```c
			  int arr[] = {1, 2, 5, 2, 2, 3, 2, 1, 5};
			  int res = 0;
			  for(int i=0; i<9; i++) res ^= arr[i];
			  printf("%d\n", res);
			  ```
			  #card
				- 3 (9개의 숫자들 중 1은 2개, 2는 4개, 5는 2개, 3은 1개, 따라서 3만 남음)
-
- ## **► 숫자의 올림 연산(ceil)**
	- 대부분의 언어에는 ceil이라는 올림연산 메서드를 지원하지만 사용할 수 없는 환경일 경우에는 다음과 같이 계산한다.
		- id:: fc2aae58-15aa-4a2b-bbb4-eaf7ef170d2c
		  replacecloze:: " '(x+y-1)//y' " 
		  
		  ```python
		  ceil(x/y) = (x+y-1)//y
		  ```