Nel C ++, ci sono 6 operatori bit a bit:
Symbol Operator
& bitwise AND
| bitwise inclusive OR
^ bitwise XOR (eXclusive OR)
<< left shift
>> right shift
~ bitwise NOT (one's complement) (unary)
In Qt, ho visto |
, ~
e &
usati abbastanza spesso nelle funzioni:
file->open(QIODevice::WriteOnly | QIODevice::Truncate);
L'origine per tale funzione assomiglia a questa:
bool QFile::open(OpenMode mode)
{
Q_D(QFile);
if (isOpen()) {
qWarning("QFile::open: File (%s) already open", qPrintable(fileName()));
return false;
}
if (mode & Append)
mode |= WriteOnly;
unsetError();
if ((mode & (ReadOnly | WriteOnly)) == 0) {
qWarning("QIODevice::open: File access not specified");
return false;
}
if (fileEngine()->open(mode)) {
QIODevice::open(mode);
if (mode & Append)
seek(size());
return true;
}
QFile::FileError err = fileEngine()->error();
if(err == QFile::UnspecifiedError)
err = QFile::OpenError;
d->setError(err, fileEngine()->errorString());
return false;
}
Il codice sorgente per l'enumerazione è simile a questo:
enum OpenModeFlag {
NotOpen = 0x0000,
ReadOnly = 0x0001,
WriteOnly = 0x0002,
ReadWrite = ReadOnly | WriteOnly,
Append = 0x0004,
Truncate = 0x0008,
Text = 0x0010,
Unbuffered = 0x0020,
NewOnly = 0x0040,
ExistingOnly = 0x0080
};
Q_DECLARE_FLAGS(OpenMode, OpenModeFlag)
Nel libro ho imparato Qt e C ++ from, non tocca in modo adeguato questi schemi di progettazione, quindi non sono nemmeno abbastanza sicuro di come leggere questo codice, o in che misura dovrei usare gli Operatori bitwise in tandem con le mie enumerazioni.
Domande
-
In che modo viene valutata la
file->open(QIODevice::WriteOnly | QIODevice::Truncate));
in primo luogo? Valuta entrambe le enumerazioni in questo modo:QIODevice::WriteOnly > 0x0002 > 0000 0000 0000 0000 0000 0010 QIODevice::Truncate > 0x0008 > 0000 0000 0000 0000 0000 1000 | 0000 0000 0000 0000 0000 1010
ed esegui la funzione in questo modo?
file->open(0000 0000 0000 0000 0000 1010); // 10 is not set in enum
-
Se questo è il caso, qual è la rilevanza del numero 10 in binario?
- Perché i numeri impostati hanno tutti i poteri di 2?
- Perché utilizzare gli esadecimali per i numeri e non per gli interi semplici?
-
Potrebbe essere applicato ogni operatore bit a bit alla funzione e come leggerlo? Questa sarebbe la mia ipotesi rudamentale:
file->open(QIODevice::WriteOnly & QIODevice::Truncate); // Both have to be true? file->open(QIODevice::WriteOnly | QIODevice::Truncate); // At least one has to be true? file->open(QIODevice::WriteOnly ^ QIODevice::Truncate); // Only one has to be true? file->open(QIODevice::WriteOnly ~ QIODevice::Truncate); // WriteOnly has to be true and Truncate has to be false file->open(QIODevice::WriteOnly << QIODevice::Truncate);// ??? file->open(QIODevice::WriteOnly >> QIODevice::Truncate);// ???
-
Nella sorgente della funzione, vedo anche cose come
|=
; Che cosa fa? - Come leggere questa riga di codice:
if ((mode & (ReadOnly | WriteOnly)) == 0)
? - In termini più pratici, quali sono le circostanze in cui userei ogni operatore bit a bit da utilizzare in tandem con le enumerazioni?
Grazie.