source

"int mask = ~0;"의 목적은 무엇입니까?

ittop 2023. 7. 16. 17:56
반응형

"int mask = ~0;"의 목적은 무엇입니까?

저는 여기 C에서 다음 코드 라인을 보았습니다.

 int mask = ~0;

의 가치를 인쇄했습니다.maskC와 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 == -00을 이지 못합니다. ①, 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

반응형