그래서 수업 시작에 문제가 발생했습니다. 나는 사람들이 나를 위해 문제를 해결해 줄 것을 부탁하는 것이 아니다. 나는 올바른 방향으로 나아가고 싶다. 32 비트 정수가 주어 졌을 때 4 번째 비트가 1로 설정된 정수를 반환하는 C에서 함수를 생성해야합니다. 나는 그것이 결국 어떻게 생겼는지 이해하지만, 시작하는 것은 길을 잃는다. for 루프 나 조건문을 사용하는 것은 허용되지 않으며 표준 비트 연산자와 논리 연산자 (! ~ &^| + < < >>) 만 사용할 수 있습니다. 다시 한번, 나는 이것을 위해 누군가를 요구하지 않고있다. 나는 올바른 길을 생각하게하는 데 약간의 도움이 필요하다. 나는 여기와 다른 페이지에서 다른 게시물을 보았지만 아무도 클릭하지 않는 것 같습니다. 나는 너를 1 비트 시프트하여 특정 장소 x < < 3이 될 수 있다는 것을 이해한다. 그러나 그 이상으로 나는 붙어있다. 어떤 도움을 주시면 감사하겠습니다.특정 비트 할당을 시작하는 데 도움이됩니다.
답변
체크 아웃 bitmasking
... 따라서 만들려면 조금에, 또는 변경을 조금 남겨하려면 1. 사용할 수 있습니다, 또는 그래서는 A 0
와 함께 사용되어 있는지 귀하의 경우에 마스크 (변경되지 않은 다른 비트를 떠나) 다음과 같습니다
진 : 10001000100010001000100010001000
진수 : 88888888
당신이 (16 진수로) 아래로 쓸 수있는 모든이있는 32 비트 정수 4 번째 비트는 1로 설정되고 다른 모든 비트는 0으로 설정됩니까?
이제 입력의 4 번째 비트를 1로 설정하고 다른 비트는 그대로 둡니다.이 마법 번호는 입력에 적용 할 수 있습니까?
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 연산 할 값은 00010000
및 00001111
입니다. 각 비트 위치는 두 피연산자 중 적어도 하나에서 0을 가지므로 결과는 0입니다. !0
이 참이므로 x != 0
인지 확인하십시오. 16 != 0
부터이 문은 true를 반환합니다. 0이 아닌 2의 제곱수가 아닌 숫자로 시도하면 x & (x - 1)
수표가 항상 true입니다. 너무 멋지다!
팁 : 0^0 = 0
및 1^1 = 0
부터 XOR을 사용하여 어떤 비트가 변경되었는지 확인할 수 있습니다. 예를 들어, 2 바이트가 있고 그 사이에 변경된 비트를 보려면 2 바이트의 XOR이 변경된 모든 비트의 위치에 1을 제공합니다.
아마도 OP가'a_32bit_int | 0x88888888'을 (를) 찾고 있습니까? –
오, 죄송합니다.이 질문이 몇살인지 알지 못했습니다 ... –