정수의 비트 변경
정수가 있습니다.
int x = 50;
이진법으로, 그것은
00110010
네 번째(4번째) 비트를 프로그래밍 방식으로 변경하려면 어떻게 해야 합니까?
숫자의 네 번째 비트는 네 번째 비트를 제외한 모든 곳에서 0의 값으로 OR을 적용하여 설정할 수 있습니다.이것은 다음과 같이 할 수 있습니다.
x |= (1u << 3);
마찬가지로, 네 번째 비트를 제외한 모든 곳에서 하나의 값으로 AND를 입력하여 네 번째 비트를 지울 수 있습니다.예를 들어,
x &= ~(1u << 3);
마지막으로, 4비트를 제외한 모든 곳에서 0 값으로 XOR하여 4비트를 전환할 수 있습니다.
x ^= (1u << 3);
이것이 작동하는 이유를 알아보려면 다음 두 가지를 살펴봐야 합니다.
- 의 은 의 행동은?
<<
이런 맥락에서 연산자? - 여기서 AND, OR 및 XOR 연산자의 동작은 무엇입니까?
의 세 스니펫는 의 는 을 했습니다 에서 했습니다 을 는 의 에서 을 사용했습니다.<<
연산자가 값을 생성합니다. 더<<
연산자로,를 몇 합니다. operator는 모든 비트를 왼쪽으로 이동합니다.당신 같은 경우엔 전
1u << 3
11 을 취한 지점에 1( 1)을 에 으로 하여 을 를 으로 을 하여 에 를 면이다진e가 생성됩니다.1000
되어 있는, 에 된 가 가 된 에
자, 왜?
x |= (1u << 3);
숫자의 네번째 비트를 정합니까?이건 수술실 운영자가 어떻게 일하는지와 관련이 있어요|=
연산자는 다음과 같습니다.+=
아니면*=
OR을 하고 - bitwise OR하고 -는다 같습니다.
x = x | (1u << 3);
≥ x ≥ OR-ing x ≥ x 1000
를 정했다고요?분의 1을 잡았다고요?이는 OR을 정의하는 방식과 관련이 있습니다.
0 | 0 == 0
0 | 1 == 1
1 | 0 == 1
1 | 1 == 1
그러나 더 중요한 것은, 우리가 이것을 더 간결하게 다시 쓸 수 있다는 것입니다.
x | 0 == x
x | 1 == 1
이는 매우 중요한 사실입니다. 이는 0인 비트를 OR로 지정해도 비트 값이 변경되지 않는 반면 1인 비트를 OR로 지정하면 해당 비트가 항상 1로 설정되기 때문입니다.이것은 우리가 글을 쓸 때
x |= (1u << 3);
(1u << 3)은 네 번째 비트를 제외한 모든 곳에서 0인 값이므로, 비트 와이즈 OR은 네 번째 비트를 제외한 모든 x의 비트를 변경하지 않고 그대로 두며, 이는 1로 설정됩니다.일반적으로 0과 1의 연속인 값으로 숫자를 OR하면 비트가 0인 경우 모든 값이 보존되고 비트가 1인 경우 모든 값이 설정됩니다.
자, 그럼 이제.
x &= ~(1u << 3);
이것은 비트 와이즈 보환 연산자를 사용합니다.~
, 숫자가 필요하고 그 숫자의 모든 부분을 뒤집는 것입니다.만약 정수가 2바이트라고 가정한다면 (단순화를 위해) 이것은 실제 인코딩을 의미합니다.(1u << 3)
가
0000000000001000
이것의 보어를 취하면, 우리는 숫자를 얻을 수 있습니다.
1111111111110111
이제 두 가치를 함께 나눌 때 어떤 일이 일어나는지 알아보겠습니다.AND 연산자는 다음과 같은 흥미로운 진리표를 가지고 있습니다.
0 & 0 == 0
0 & 1 == 0
1 & 0 == 0
1 & 1 == 1
또는, 좀 더 간결하게:
x & 0 == 0
x & 1 == x
이것은 만약 우리와 두 숫자가 함께 있다면, 결과 값은 모든 비트가 0으로 설정되고 다른 모든 비트는 보존된다는 것을 의미합니다.이 말은 우리가 만약
~(1u << 3)
우리는 AND-ing 와 함께 있습니다.
1111111111110111
따라서 위의 표에 따르면 이는 "네 번째 비트를 제외한 모든 비트를 그대로 유지한 다음 네 번째 비트를 0으로 변경"한다는 의미입니다.
일반적으로 비트 집합을 지우려면 비트를 변경하지 않고 원하는 모든 곳에 하나씩, 비트를 지우려는 곳에 0으로 숫자를 만듭니다.
마지막으로, 그 이유를 알아보겠습니다.
x ^= (1u << 3)
숫자의 네 번째 비트를 뒤집습니다.이는 이진 XOR 연산자에 다음과 같은 진리표가 있기 때문입니다.
0 ^ 0 == 0
0 ^ 1 == 1
1 ^ 0 == 1
1 ^ 1 == 0
주의하세요.
x ^ 0 == 0
x ^ 1 == ~x
어디에~x
는 x의 반대이고, 1의 경우는 0이고 0의 경우는 1입니다.이것은 만약 우리가 그 값으로 XOR x를 하면(1u << 3)
, 우리는 그것을 XOR 하고 있습니다.
0000000000001000
따라서 이것은 "네 번째 비트를 제외한 모든 비트를 그대로 유지하되 네 번째 비트를 뒤집는다."를 의미합니다.일반적으로, 몇 개의 비트를 플립하려면 비트를 그대로 유지할 0과 비트를 플립할 1을 가진 값을 XOR합니다.
도움이 되길 바랍니다!
언제든지 사용할 수 있습니다.std::bitset
비트를 쉽게 수정할 수 있습니다.
또는 비트 조작을 사용할 수도 있습니다(1에서 4번째 비트를 세는 것을 의미한다고 가정합니다.0)에서 세는 것을 의미한다면 1을 빼지 마십시오.내가 사용하는 노트1U
전체 작업이 서명되지 않은 번호에서 수행되도록 보장합니다.
설정 방법:x |= (1U << (4 - 1));
지우기:x &= ~(1U << (4 - 1));
전환 방법:x ^= (1U << (4 - 1));
네 번째 비트를 설정하려면,OR
와 함께00001000
(점령).)
네 번째 비트를 지우려면,AND
와 함께11110111
(점령).)
네 번째 비트를 전환하려면,XOR
와 함께00001000
(점령).)
예:
00110010 OR 00001000 = 00111010
00110010 및 11110111 = 00110010
00110010 XOR 00001000 = 00111010
단순해요, 당신이 가지고 있거나, 당신이 가지고 있는 가치가 무엇이든 간에
int x = 50;
네 번째 비트(오른쪽부터)를 프로그램적으로 설정하려면,
int y = x | 0x00000008;
,0x
숫자 앞에 접두사를 붙이면 16진법이란 뜻입니다0x0 = 0000
이진법으로, 그리고0x8=1000
◦ 이 나온 .그래서 답이 나온 거지.
C 언어로 된 이 함수 중 하나를 시도해 보면 n비트가 바뀝니다.
char bitfield;
// start at 0th position
void chang_n_bit(int n, int value)
{
bitfield = (bitfield | (1 << n)) & (~( (1 << n) ^ (value << n) ));
}
void chang_n_bit(int n, int value)
{
bitfield = (bitfield | (1 << n)) & ((value << n) | ((~0) ^ (1 << n)));
}
void chang_n_bit(int n, int value)
{
if(value)
bitfield |= 1 << n;
else
bitfield &= ~0 ^ (1 << n);
}
char print_n_bit(int n)
{
return (bitfield & (1 << n)) ? 1 : 0;
}
이진 AND 및 OR을 사용하여 네 번째 비트를 전환할 수 있습니다.
네 번째x 를 하려면 을 합니다 합니다 을 하려면 를 x |= 1<<3;
,1<<3
0b1000해에다가쪽의을해다0가는sge쪽ag0fb0t3tyb에010의b .
네 x 를 을 합니다 의 합니다 을 를 의 x &= ~(1<<3);
와 , 의 모든 를 마스킹하여 0b00110010 (x)으로 (x)와 () 0b11110111 의 4 의 x 를 에 의 를 의
언급URL : https://stackoverflow.com/questions/6916974/change-a-bit-of-an-integer
'programing' 카테고리의 다른 글
VBA TypeOf 연산자가 실패하는 이유 (0) | 2023.09.08 |
---|---|
공식에 대한 간단한 엑셀 찾기 및 바꾸기 (0) | 2023.09.08 |
Innodbon MariaDB가 자동으로 쓰기 실패 중입니다. (0) | 2023.09.08 |
'div'의 알려진 속성이 아니므로 'aria-value now'에 바인딩할 수 없습니다. (0) | 2023.09.08 |
nodejs express, ajax posting with jquery 및 수신 응답 (0) | 2023.09.08 |