2012-09-04 3 views
2

그래서 만약 number1과 또 다른 number2 .. 두 정수가 있다면 bitwise 연산을 사용하여 두개의 숫자를 더하는 방법으로 접근법을 수정합니까? 어떤 테스트 케이스에서 이것이 잘못 될 수 있습니까?두 개의 숫자를 더하는 비트 연산?

public int add(int number1, int number2) 
{ 
int carry = (number1&number2)<<1; 
int sum = number1^number2^carry; 
return sum; 
} 
+1

평범하지 않은 숫자를 연결하면 틀린 것을 알게됩니다. 추가 기능은 차례로 연결해야합니다. (힌트 : 루프가 필요함) – Mysticial

+0

이 두 숫자의 예를 들어 줄 수 있습니까? – Phoenix

+2

'3 + 1'은 지금까지의 대답에서 주어진 것입니다. 쇠사슬로 묶인 물건이 있으면 '63 + 1', 127 + 1 등으로 잘못 될 것입니다 ... – Mysticial

답변

6

예. 이 방법은 다중 운반을 포함하는 추가에는 작동하지 않습니다. 가장 간단한 경우는 3 + 1입니다. 결과적으로 귀하의 기능은 0이됩니다.

이 문제를 해결할 수있는 간단한 일반 솔루션은 없습니다. 모든 솔루션은 정수의 너비를 고려해야합니다. 일부 접근법에 대해서는 Wikipedia's article on gate-level implementations of addition을 참조하십시오. 여기

9

Full Adder

는 회로 설계자는 두 개의 숫자를 추가하는 방법입니다. 평행 한 왼쪽 모서리가있는 가운데의 두 개는 AND (&)이고 마지막 단일 모서리가 왼쪽 모서리 인 마지막 두 개는 OR (|)입니다.).

이제 마스크를 사용하여 한 번에 한 비트 씩 코드로 변환 할 수 있습니다.

public int add(final int A, final int B) { 
    int mask = 1; 
    int sum = 0; 
    int carry = 0; 

    for (int i = 1; i <= Integer.SIZE; i++) { //JVM uses 32-bit int 
     int a = A & mask; //bit selection 
     int b = B & mask; 

     //sum uses |= to preserve the history, 
     //but carry does not need to, so it uses = 
     sum |= a^b^carry; //essentially, is the sum of bits odd? 
     carry = ((a & b) | ((a^b) & carry)) << 1; //are exactly two of them 1? 

     mask <<= 1; //move on to the next bit 
    } 
    return sum; 
} 
+0

이 작동하지 않습니다. 나는 3과 9를 확인하고 12를 얻었습니다. 또한 음수 + 양수에 대해서는 작동하지 않습니다. – cookya

+3

양수 값과 음수 값 모두에 대해 작동하며 500 개가 넘는 값을 테스트했습니다. – SVashisth

0

예 잘못된 것입니다. 우리는 while 루프를 사용할 수 있습니다. 코드는 다음과 같습니다.

static int addTwoNumbers(int a, int b) 
{ 
    int carryNum; 

    while(b ! =  0) 
    { 
     carryNum = a & b; 
     a = a^b; 
     b = carryNum << 1; 
    } 
    return a; 
}