~와-의 차이

스푸키 우기

그래서 저는 Huffman 코딩을 엉망으로 만들고 있었는데 제가 이미 알고 있어야 할 것 같은 느낌이 들었지만 유감스럽게도 그렇게하지 않았습니다.

문제가되는 것은 제목에 있으며이 방법과 관련이 있습니다.

void BinWriter::writeBit(bool b) {
    A ^= (-b^A)&(1UL << n++); // A is of type char

    if (n == 8) {
        ofd.write((char*)&A, 1);
        n = 0;
    }
}

~b대신 쓰면 -b결과가 크게 다릅니다. 왜 이런거야? ~부정 연산자라고 가정 하지 않습니까? -이 경우 와 어떻게 다릅니 까?

또한 Visual Studio (2017)는이 두 연산자 모두 bool 형식에 대해 '안전하지 않다'고 경고합니다. 그 이유는 무엇입니까?

보유

당신은 정수 승진에 실패하고 있습니다. 그다지 과학적이지 않은 설명은 특정 연산자에 대해 명시 적으로 정의되지 않은 경우 C ++가 내장 정수 유형 (포함 bool)을 int. 그러면 다음과 같은 결과가 나타납니다.

#include <iostream>
int main()
{
    std::cout << std::boolalpha;
    std::cout << "~: " << ~true << ", " << ~false << "\n";
    std::cout << "-: " << -true << ", " << -false << "\n";
    std::cout << "!: " << !true << ", " << !false << "\n";
}

인쇄됩니다

~: -2, -1
-: -1, 0
!: false, true

!실제로에 대해 정의 된 이러한 연산자 bool중 다른 두 연산자는 정수 승격 ( false0 으로 전환 true되고 1로 변경됨)을 강제 하는 방식 유의하십시오 .

-b^A다음 "경우 모든 비트 같은 방법으로 계속 의미 bfalse경우 모두, 플립 b입니다 true동안," ~b^A수단 "항상 모든 비트를 플립하지만 경우에만 마지막 하나 b입니다 false"- 완전히 다른 의미를!

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

TOP 리스트

뜨겁다태그

보관