Svmmarivm
Processori nvmervs integer est ordo bitorvm, et C++ operatores praebet qvi in hvnc ordinem colvmnatim agvnt: &, |, ^ et ~, atqve translationes << et >>. Haec lectio docet qvomodo manv compvtentvr, qvomodo adhibeantvr vt plvra vexilla in vno nvmero integro arte larvarvm serventvr, et qvomodo translationes agnoscantvr qvas norma non definit. Deinde explicat cvr 2 ^ 3 valeat 1, non 8, et cvr operatores bitorvm parentheses postvlent. Dimidivm altervm bibliothecam mathematicam praesentat: fvnctiones capitis <cmath>, constantes capitis <numbers>, maximvm commvnem divisorem et minimvm commvne mvltiplvm capitis <numeric> et fvnctiones bitorvm capitis <bit>, cvm principio qvod in qvalibet lingva valet: qvod bibliotheca rectvm et exploratvm praebet, non rescribitvr.
Proposita discendi
- Manv compvtare eventvm operatorvm
&,|,^,~et translationvm in nvmeris integris parvis. - Translationes definitas (etiam nvmerorvm negativorvm, inde a C++20) ab iis qvae modvs agendi indefinitvs svnt distingvere, et eventvm priorvm praedicere.
- Larvis vti ad bit inspiciendvm, accendendvm, exstingvendvm et alternandvm.
- Explicare cvr
2 ^ 3valeat 1, non 8, et pro casv interstd::powet translationem eligere. - Fvnctionibvs capitis
<cmath>(std::sqrt,std::pow,std::abs,std::hypot, trigonometricis) et constantibvs capitis<numbers>, vtstd::numbers::pi, in formvlis vti.
Operatores bitorvm
Lectio Nvmeri integri eorvmqve repraesentatio ostendit int ordinem bitorvm esse, 32 in systematibvs cvrsvs, eivsqve valorem esse svmmam pondervm locorvm in qvibvs 1 inest. Adhvc tamen programma nvmervm integrvm tantvm vt nvmervm tractavit: evm addidit, mvltiplicavit, divisit. Atqvi idem ordo aliam interpretationem admittit, vt collectio 32 responsorvm affirmantivm vel negantivm, et ad hanc interpretationem C++ qvattvor operatores habet qvi in bit singvla operantvr, sine vllo transitv inter locos.
Bit a dextra nvmerantvr, a 0 incipiendo: bit est id cvivs pondvs est . Ita in , qvi in binario est 1100, bit 2 et 3 accensa svnt, bit 0 et 1 exstincta.
Operatores hi svnt. Operator et per bit, a & b, 1 habet in omni loco in qvo a et b ambo 1 habent. Operator vel per bit, a | b, 1 habet vbi saltem alter e dvobvs id habet. Operator vel exclvsivvm, a ^ b, 1 habet vbi vnvs tantvm e dvobvs id habet, id est vbi bit differvnt. Negatio per bit, ~a, vnvm tantvm operandvm habet et qvodqve bit invertit. Tabvlae trivm priorvm, pro pari bitorvm et , svnt conivnctionis, disivnctionis et disivnctionis exclvsivae:
Qvi cvrsvm Logica Mathematica I absolvit connectiva propositionalia hic agnoscet, 1 pro vero et 0 pro falso: operator bitorvm nihil alivd est qvam connectivvm omnibvs colvmnis simvl adhibitvm. Hinc seqvitvr modvs manv compvtandi: dvo nvmeri in binario scribvntvr, alter svper altervm, ad dextram aeqvati, et tabvla in qvaqve colvmna adhibetvr, vicinis neglectis.
Nvmeri 1100 et 1010 hanc proprietatem habent, vt qvattvor eorvm colvmnae qvattvor combinationes dvorvm bitorvm percvrrant; ideo apti svnt ad tres tabvlas simvl videndas.
Demonstratio
Data:
1100est 12 et1010est 10. Colvmnae, a sinistra ad dextram, paria , , et habent.Prima colvmna
12 & 10: ambo bit svnt 1, et «et» dat 1.Secvnda colvmna:
1et0. Satis est vnvm 0 vt «et» det 0.Tertia colvmna:
0et1; «et» itervm dat 0.Qvarta colvmna:
0et0dant 0. Ordo eventvs,1000, est 8:12 & 10valet 8.«Vel» omnem colvmnam accendit qvae saltem vnvm 1 habet:
1110, id est12 | 10valet 14.Vel exclvsivvm eas tantvm colvmnas accendit qvarvm bit differvnt:
0110, et12 ^ 10valet 6.
Programma seqvens figvram confirmat. Specificatio formae {:04b}, in lectione de nvmeris integris praesentata, valorem in binario qvattvor digitis scribit, cifris 0 completis.
#include <print>int main(){ const int a{0b1100}; const int b{0b1010}; std::println("a = {:04b} = {}", a, a); std::println("b = {:04b} = {}", b, b); std::println("a & b = {:04b} = {}", a & b, a & b); std::println("a | b = {:04b} = {}", a | b, a | b); std::println("a ^ b = {:04b} = {}", a ^ b, a ^ b); std::println("~a = {}", ~a);}a = 1100 = 12b = 1010 = 10a & b = 1000 = 8a | b = 1110 = 14a ^ b = 0110 = 6~a = -13Vltimvs versvs explicationem meretvr. Negatio 32 bit ipsivs a invertit, non tantvm qvattvor qvae scribvntvr: 28 bit valentia 0 ad sinistram fivnt 1, et int qvod ab 1 incipit negativvm est in complemento ad dvo. Atqvi in complemento ad dvo oppositvm nvmeri obtinetvr bit eivs invertendo et 1 addendo, id est ; ergo , et ~12 valet . Negatio per bit in nvmero integro cvm signo igitvr nvmervm dat qvi raro vt nvmervs interest: interest vt dispositio, et ideo bit potivs in generibvs sine signo tractantvr, vt infra videbitvr, vbi de larvis agitvr.
Cavtio de generibvs parvis. Anteqvam operetvr, C++ omne operandvm generis integri angvstioris, vt std::uint8_t, in int convertit; haec est promotio qvam lectio Arithmetica pro operationibvs arithmeticis descripsit, et hic qvoqve valet. Hinc seqvitvr ~flags, cvm flags generis std::uint8_t sit et valoris 5, non esse octetvm 11111010, sed int , cvivs 32 bit 24 bit valentia 1 ad sinistram addita continent; tantvm cvm rvrsvs in std::uint8_t servatvr, ad octo bit reciditvr et octetvs exspectatvs, 250, recvperatvr.
Operatores bitorvm cvm operatoribvs logicis lectionis Relationes et logica confvndendi non svnt. 6 && 3 est true: ambo operanda a nihilo differvnt, et eventvs est bool. 6 & 3 contra nvmervs integer est, qvem colvmnae formant in qvibvs ambo 1 habent. Praeterea && aestimatione brevi circvitv aestimatvr, & avtem semper ambo operanda aestimat.
Argvmentvm oneratvr…