2015-01-15 1 views
2

다음 문제에 대한 알고리즘을 작성하려고합니다.비트 플립 알고리즘 작성

문제 선언.

32 비트 부호없는 정수 목록이 제공됩니다. 이진 표현으로 비트를 뒤집어서 얻은 부호없는 정수 목록을 출력해야합니다 (즉, 설정되지 않은 비트를 설정해야하며 설정 비트는 설정 해제해야합니다).

def bit_flip(a): 
    return ~a & 0xffffffff 

t = raw_input("") 
a = map(int, t.split()) 
map(lambda x: x^0xffffffff, a) 
for i in a: 
    print bit_flip(int(i)) 

입력이

3 
2147483647 
1 
0 

내가 출력

될 것으로 예상되는 반면 4,294,967,292

이다 얻는 출력된다 : 다음

코드는

**2147483648 
    4294967294 
    4294967295** 

내가 잘못 된 곳인지 잘 모르겠습니다. 출력은 출력의 적어도 한 행에 가깝지만 동일하지는 않습니다.

+0

예상되는 출력에 대한 입력은 무엇입니까? 그것은 각 숫자에 대해 비트를 두 번 뒤집을 것입니다 (한 번'''와''bit_flip'). – Cameron

+0

해커 크랭크 문제가 아닌가요? – AlG

+0

예. 방금 기본 파이썬 수업을 마쳤습니다. 잠시 동안이 문제에 봉착했습니다. – sanster9292

답변

2

출력 결과가 정확합니다. 3의 32 비트 부호없는 보완은 실제로 4294967292입니다. 프로그램에 의해 생성 된 최대 출력은 다음과 같습니다 당신이 진수에서 그들을 작성하는 경우 숫자 3, 2147483647, 1에 제대로 대응

4294967292 
2147483648 
4294967294 
4294967295 

, 0 당신은 더 쉽게 볼 수 있습니다 :

Dec   Hex  ~Hex  ~Dec 
3   3   FFFFFFFC 4294967292 
2147483647 7FFFFFFF 80000000 2147483648 
1   1   FFFFFFFE 4294967294 
0   0   FFFFFFFF 4294967295 

비트를 두 번 튀기고있는 것 같지만 결과를 처음으로 버리는 것 같습니다. map(lambda x: x^0xffffffff, a)은 반전 된 값이 들어있는 목록을 반환합니다.이 목록에는 아무 것도 지정하지 않습니다. 당신이 a 결과를 다시 할당 할 그 라인을 변경 한 경우 (단지 다른 방법을 통해, 비트를 뒤집는) 더 이상 bit_flip 필요하지 않을 : 심지어

t = raw_input("") 
a = map(int, t.split()) 
a = map(lambda x: x^0xffffffff, a) 
for i in a: 
    print i 

이하 :

for i in map(lambda x: int(x)^0xffffffff, raw_input("").split()): 
    print i 
0

map(lambda x: x^0xffffffff, a)이 반환하는 목록이 대답이지만 사용하지는 않습니다.

최소한 비트가 반전 된 정수가 있습니다. 예상되는 출력에 입력보다 하나의 요소가 적은 이유가 확실하지 않습니다.

+0

(이는 적절한 테스트 사례/입력이 몇 개가 있어야 하는지를 알려주는 첫 번째 숫자로 인한 것일 수 있음) – greybeard