그래서 저는 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
중 다른 두 연산자는 정수 승격 ( false
0 으로 전환 true
되고 1로 변경됨)을 강제 하는 방식 에 유의하십시오 .
-b^A
다음 "경우 모든 비트 같은 방법으로 계속 의미 b
인 false
경우 모두, 플립 b
입니다 true
동안," ~b^A
수단 "항상 모든 비트를 플립하지만 경우에만 마지막 하나 b
입니다 false
"- 완전히 다른 의미를!
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다