비트 연산에 대한 질문 (비트 빼기는 어떤식으로 하나요?)

air74의 이미지

안녕하세요.

unsigned int a = 0xfffaffff;
unsigned int b = 0x3f0fbbba;

위와 같을 경우 a 의 각각의 bit 와 b 와 비교 하여 b 의 bit 가 1 로 세팅 되어 있을경우 해당하는 a 의 비트를 0 으로 만들고 싶습니다. (단 a의 해당하는 비트가 0 이면 상관 없습니다.)

제 생각에는 b 의 1의 보수를 구해서 & 연산을 하면 될거 같은데 b 에 대한 1 의 보수를 구하려면 어떻게 해주어야 하나요?

좋은 생각이 떠오르지 않습니다. 조언 좀 부탁 드립니다.

unsigned int a = 0xfffaffff;
unsigned int b = 0x3f0fbbba;

/* 질문 1.  이런 루틴이면 될까요? */
a &= (b의 1의 보수) /* 질문 2. --> b의 1에대한 보수를 어떻게 구할 수 있나요? */
philossh의 이미지

간단하게 비트 부정연산자(~) 가 있지요..
'!' 는 논리부정.. 0이 아닌값을 false로 false를 true로..
'~' 는 비트부정.. 0인비트를 1로 1인비트를 0으로..

To be or not to be.
That is the question.

익명 사용자의 이미지

뺄셈을 논리연산 및 덧셈만으로 표현
- 덧셈은 Half Adder, Full Adder등을 논리회로로 구현한다는...
- 뺄셈은 덧셈으로 표현가능하다는.... 물론, 논리연산이 필요하다는
- 아~ 하다가 보면 모든 연산은 덧셈으로 구현가능하다는...

* 수학적 표현
i - j
* 논리연산에 의한 표현(+연산은 논리연산으로 구현했다는 가정)
i+(j의 2의 보수)

2의보수? ex) A의 2의 보수= Not A + 1
따라서, 다음과 같다.
i-j = i+(~j+1)

예제)

main()
{
   int i, j;
   int s;

   i = 3, j=-4;
   s = i + (~j + 1);
   printf( "%d \n", s);
}