"int mask = ~0;"의 목적은 무엇입니까?
저는 여기 C에서 다음 코드 라인을 보았습니다.
int mask = ~0;
의 가치를 인쇄했습니다.mask
C와 C++로 표시됩니다.항상 인쇄됩니다.-1
.
그래서 몇 가지 질문이 있습니다.
- 값을 할당하는 이유
~0
마스크 변수로? - 의 목적은 무엇입니까?
~0
? - 사용할 수 있습니까?
-1
대신에~0
?
현재 아키텍처에서 정수에 포함된 비트 수를 알 필요 없이 정수의 모든 이진 비트를 1비트로 설정할 수 있는 휴대용 방법입니다.
C와 C++는 부호 크기, 한 개의 보어, 두 개의 보어의 세 가지 다른 부호 정수 형식을 허용합니다.
~0
시스템에서 사용하는 부호 형식에 관계없이 올원 비트를 생성합니다.그래서 그것은 더 휴대하기 쉽습니다.-1
추가할 수 있습니다.U
접미사(즉, 접미사)-1U
)를 선택하여 휴대용으로 올원 비트 패턴을1 생성합니다.하지만~0
더 명확한 의도를 나타냄: 0 값의 모든 비트를 반전시키는 반면, -1은 이진 표현이 아닌 마이너스 1의 값이 필요함을 나타냅니다.
1 부호 없는 연산은 항상 감소된 모듈로 결과 유형으로 나타낼 수 있는 가장 큰 값보다 1 큰 숫자이기 때문입니다.
2의 보어 플랫폼(가정)에서 -1을 제공하지만 -1을 직접 쓰는 것은 규칙에 의해 금지됩니다(정수 0만).255, 일년!
,~
및 이진수&
,^
,|
,+
,<<
그리고.>>
허용됨).
주어진 작업을 수행하기 위해 연산자와 언어 구성에 대한 여러 가지 제한이 있는 코딩 과제를 연구하고 있습니다.
첫 번째 문제는 값 -1을 사용하지 않고 반환하는 것입니다.-
교환입니다.
2의 보어로 음수를 나타내는 기계에서 값은-1
모든 비트가 다음으로 설정되어 표시됩니다.1
,그렇게~0
로 평가함.-1
:
/*
* minusOne - return a value of -1
* Legal ops: ! ~ & ^ | + << >>
* Max ops: 2
* Rating: 1
*/
int minusOne(void) {
// ~0 = 111...111 = -1
return ~0;
}
파일의 다른 문제가 항상 올바르게 구현되는 것은 아닙니다.두 번째 문제는 사실을 나타내는 부울 값을 반환하는 것입니다.int
값은 16비트 부호가 있는 값에 적합합니다.short
결함 있음:
/*
* fitsShort - return 1 if x can be represented as a
* 16-bit, two's complement integer.
* Examples: fitsShort(33000) = 0, fitsShort(-32768) = 1
* Legal ops: ! ~ & ^ | + << >>
* Max ops: 8
* Rating: 1
*/
int fitsShort(int x) {
/*
* after left shift 16 and right shift 16, the left 16 of x is 00000..00 or 111...1111
* so after shift, if x remains the same, then it means that x can be represent as 16-bit
*/
return !(((x << 16) >> 16) ^ x);
}
왼쪽 이동 음의 값 또는 이동 값이 다음 범위를 벗어나는 숫자int
정의되지 않은 동작이 있습니다. 음의 값을 오른쪽으로 이동하는 것은 구현이 정의되므로 위의 솔루션은 올바르지 않습니다(예상 솔루션일 수 있지만).
오래 전만 해도 1K ZX 80 또는 ZX 81 컴퓨터와 같이 극히 제한된 장비에서 메모리를 절약하는 방법이었습니다.BASIC에서 당신은.
Let X = NOT PI
보다는
LET X = 0
숫자가 4바이트 부동 소수점으로 저장되었기 때문에, 후자는 NOT와 PI가 각각 단일 바이트를 차지하는 첫 번째 NOT PI 대안보다 2바이트를 더 많이 차지합니다.
모든 컴퓨터 아키텍처에서 숫자를 인코딩하는 방법은 여러 가지가 있습니다.할 때 입니다: 2의 보어를 사용할 때: 2의 보어는 다음과 같습니다.~0 == -1
하기 위해하는데, 는 한편, 일컴는의위아사 1음사용는, 이는데하인데보부, 를수닌코는하딩실 때문입니다.~0 == -0
0을 이지 못합니다. ①, 1s 보어는 0과 0의 차이가 있습니다.
그래서 당신의 질문에.
- -> making 마에이 ~0어마스할모든의크비동트일가록하도스당되만기들크▁-> 1 ->▁▁the만.
mask & sth == sth
- ~0은 사용되는 플랫폼에 관계없이 모든 비트를 1로 만드는 데 사용됩니다.
- 컴퓨터 플랫폼에서 2의 보완 번호 인코딩을 사용하는 것이 확실하다면 ~0 대신 -1을 사용할 수 있습니다.
저의 개인적인 생각 - 당신의 코드를 가능한 한 플랫폼에 독립적으로 만드세요.비용이 상대적으로 적으며 코드가 고장 방지가 됩니다.
언급URL : https://stackoverflow.com/questions/46376693/what-is-the-purpose-of-int-mask-0
'source' 카테고리의 다른 글
ORA-03113: ASP.Net 앱에서 장시간 비활성화 후 통신 채널의 파일 종료 (0) | 2023.07.16 |
---|---|
PL/SQL 프로시저 이름 찾기 (0) | 2023.07.16 |
SQL Server 데이터베이스 테이블에 데이터 테이블을 삽입하는 방법은 무엇입니까? (0) | 2023.07.16 |
동적 SQL 문에서 테이블 변수를 사용하는 방법은 무엇입니까? (0) | 2023.07.16 |
ggplot2에서 매핑이 안정적인 범주형 변수에 색상을 할당하는 방법은 무엇입니까? (0) | 2023.07.16 |