2015-01-03 3 views
2

내가 15를 c라고 가정 해 보겠습니다. c는 a = 7 및 b = 13으로 분할 될 수 있습니다. a | b = c. 나는 c를 입력으로 주어 a와 b의 가능한 조합을 찾을 수있는 함수를 작성하려고합니다.역순으로 '|' Bitshift 또는

class Program 
{ 
    static void Main(string[] args) 
    { 
     int data = 560; 
     int[] v = FindBitshiftOr(data); 
     Console.WriteLine("{0} << {1} = {2}", v[0], v[1], v[0] | v[1]); 
     Console.ReadKey(); 
    } 


    private static Random r = new Random(); 
    private static int[] FindBitshiftOr(int value) 
    { 
     int[] d = new int[2]; 
     int a = r.Next(0, value); 
     int c = r.Next(0, value); 
     int b = ~a; 
     d[0] = a; 
     d[1] = b | c; 
     return d; 
    } 
} 

이것은 내 시도 였지만 항상 -1을 반환하고 누군가 내게 무엇이 잘못되었는지 설명 할 수 있습니까?

+0

배열이 될 수 없습니다 (''[] INT) "항상 -1"... 당신은 명확하게 될까요 동일해야? –

+0

당신은'c'에있는 모든 비트를 알고 있습니다. 그래서 대답은 그 비트의 모든 조합입니다. 그러나 일반적으로 "역"비트 OR을 수행하는 것은 불가능합니다. 예를 들어 단일 비트 세트 이상이있는 경우 여러 조합이 있고 단일 "올바른"솔루션이없는 것처럼 말입니다. –

+0

그건 내가 v [0] | v [1] = -1 –

답변

2

이 코드를 사용해보십시오. 연산은 동일한 비트를 추출하는 데 사용됩니다. C#을 모르므로 정확한 코드를 입력 할 수 없습니다. 논리는 랜덤 비트 마스크를 취하고 c의 비트와 그 비트 마스크와 그 비트 마스크의 역함수를 AND합니다. 그 결과 두 숫자가 필요한 숫자가됩니다.

int c = 4134; 
int a = r.Next(0, value); 
int first_num = c & a; 
int second_num = c & ~a; 
int check_c = first_num | second_num 

check_cc

+0

큰 감사, 이것은 잘 작동합니다 :) 도움에 감사드립니다 !! –

2

모든 비트를 함께 ORing하여 1으로 설정했기 때문에 -1이됩니다. 코드의

필수 부분은 다음과 같습니다 분리 비트의

int a = 42; // you get random number, but it does not matter here. 
int b = ~a | c; // "| c" part just possibly add more 1s 

result = a | b; // all 1s as it essentially (a | ~a) | c 

적절한 방법은 x & ~mask 것 - Most common C# bitwise operations on enums에 링크/샘플을 참조하십시오.