2011-09-03 4 views
2

그래서 수업 시작에 문제가 발생했습니다. 나는 사람들이 나를 위해 문제를 해결해 줄 것을 부탁하는 것이 아니다. 나는 올바른 방향으로 나아가고 싶다. 32 비트 정수가 주어 졌을 때 4 번째 비트가 1로 설정된 정수를 반환하는 C에서 함수를 생성해야합니다. 나는 그것이 결국 어떻게 생겼는지 이해하지만, 시작하는 것은 길을 잃는다. for 루프 나 조건문을 사용하는 것은 허용되지 않으며 표준 비트 연산자와 논리 연산자 (! ~ &^| + < < >>) 만 사용할 수 있습니다. 다시 한번, 나는 이것을 위해 누군가를 요구하지 않고있다. 나는 올바른 길을 생각하게하는 데 약간의 도움이 필요하다. 나는 여기와 다른 페이지에서 다른 게시물을 보았지만 아무도 클릭하지 않는 것 같습니다. 나는 너를 1 비트 시프트하여 특정 장소 x < < 3이 될 수 있다는 것을 이해한다. 그러나 그 이상으로 나는 붙어있다. 어떤 도움을 주시면 감사하겠습니다.특정 비트 할당을 시작하는 데 도움이됩니다.

답변

0

체크 아웃 bitmasking

... 따라서 만들려면 조금에, 또는 변경을 조금 남겨하려면 1. 사용할 수 있습니다, 또는 그래서는 A 0

와 함께 사용되어 있는지 귀하의 경우에 마스크 (변경되지 않은 다른 비트를 떠나) 다음과 같습니다

진 : 10001000100010001000100010001000 진수 : 88888888

1

당신이 (16 진수로) 아래로 쓸 수있는 모든이있는 32 비트 정수 4 번째 비트는 1로 설정되고 다른 모든 비트는 0으로 설정됩니까?

이제 입력의 4 번째 비트를 1로 설정하고 다른 비트는 그대로 둡니다.이 마법 번호는 입력에 적용 할 수 있습니까?

2
int get_int_with_every_fourth_bit_set() 
{ 
    return 0x88888888; 
} 

좋습니다. 여기에 비트 연산자가하는 일의 목록은 다음과 같습니다

  • 비트 NOT (~) : 조금, 0 1
  • AND (&) 0-1 및 토글 : 비트를 설정하면 해당 위치의 비트 두 피연산자
  • OR 설정된다 (|) 그 위치에있는 비트 피연산자로 설정 될 경우 비트를
  • XOR (^) 그 위치에 정확히 한 비트가 두 개 사이에서 설정되는 경우에 비트를 설정 피연산자
  • 비트 시프트 (<<>>) : 지정된 양만큼 지정된 방향으로 각 비트를 이동합니다. 왼쪽으로 시프트 할 때 최하위 비트에 0이 추가됩니다. 오른쪽으로 시프트 할 때 값이 부호가 없거나 양수이면 0이 추가됩니다.

    하나 남긴 비트 시프트가 두 곱과 동일합니다 : 여기

알고 좋은 일부 비트 트릭입니다. 오른쪽으로 1 비트 씩 이동하는 것은 2로 나누고 반올림하는 것과 같습니다.

모든 2의 제곱은 정확히 1 비트 1을가집니다.숫자 2의 거듭 제곱 있는지 확인하려면이 작업을 수행 할 수 있습니다

예를 들어

return !(x & (x - 1)) && x

, 2의 거듭 제곱 인 x = 16을 말한다. 그런 다음 x - 1 = 15이므로 AND 연산 할 값은 0001000000001111입니다. 각 비트 위치는 두 피연산자 중 적어도 하나에서 0을 가지므로 결과는 0입니다. !0이 참이므로 x != 0인지 확인하십시오. 16 != 0부터이 문은 true를 반환합니다. 0이 아닌 2의 제곱수가 아닌 숫자로 시도하면 x & (x - 1) 수표가 항상 true입니다. 너무 멋지다!

팁 : 0^0 = 01^1 = 0부터 XOR을 사용하여 어떤 비트가 변경되었는지 확인할 수 있습니다. 예를 들어, 2 바이트가 있고 그 사이에 변경된 비트를 보려면 2 바이트의 XOR이 변경된 모든 비트의 위치에 1을 제공합니다.

+0

아마도 OP가'a_32bit_int | 0x88888888'을 (를) 찾고 있습니까? –

+0

오, 죄송합니다.이 질문이 몇살인지 알지 못했습니다 ... –