Ad argvmentvm transi
Topos Uranos

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

  1. Manv compvtare eventvm operatorvm &, |, ^, ~ et translationvm in nvmeris integris parvis.
  2. Translationes definitas (etiam nvmerorvm negativorvm, inde a C++20) ab iis qvae modvs agendi indefinitvs svnt distingvere, et eventvm priorvm praedicere.
  3. Larvis vti ad bit inspiciendvm, accendendvm, exstingvendvm et alternandvm.
  4. Explicare cvr 2 ^ 3 valeat 1, non 8, et pro casv inter std::pow et translationem eligere.
  5. Fvnctionibvs capitis <cmath> (std::sqrt, std::pow, std::abs, std::hypot, trigonometricis) et constantibvs capitis <numbers>, vt std::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 kk est id cvivs pondvs est 2k2^k. Ita in 1212, 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 pp et qq, svnt conivnctionis, disivnctionis et disivnctionis exclvsivae:

pqp&qp∣qp^q11110100110101100000\begin{array}{cc|ccc} p & q & p \mathbin{\&} q & p \mid q & p \mathbin{\hat{}} q \\ \hline 1 & 1 & 1 & 1 & 0 \\ 1 & 0 & 0 & 1 & 1 \\ 0 & 1 & 0 & 1 & 1 \\ 0 & 0 & 0 & 0 & 0 \end{array}

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.

ExemplvmDvodecim et decem, colvmna post colvmnam

Nvmeri 12=12 = 1100 et 10=10 = 1010 hanc proprietatem habent, vt qvattvor eorvm colvmnae qvattvor combinationes dvorvm bitorvm percvrrant; ideo apti svnt ad tres tabvlas simvl videndas.

Demonstratio

  1. Data: 1100 est 12 et 1010 est 10. Colvmnae, a sinistra ad dextram, paria (1,1)(1, 1), (1,0)(1, 0), (0,1)(0, 1) et (0,0)(0, 0) habent.

  2. Prima colvmna 12 & 10: ambo bit svnt 1, et «et» dat 1.

  3. Secvnda colvmna: 1 et 0. Satis est vnvm 0 vt «et» det 0.

  4. Tertia colvmna: 0 et 1; «et» itervm dat 0.

  5. Qvarta colvmna: 0 et 0 dant 0. Ordo eventvs, 1000, est 8: 12 & 10 valet 8.

  6. «Vel» omnem colvmnam accendit qvae saltem vnvm 1 habet: 1110, id est 12 | 10 valet 14.

  7. Vel exclvsivvm eas tantvm colvmnas accendit qvarvm bit differvnt: 0110, et 12 ^ 10 valet 6.

Programma seqvens figvram confirmat. Specificatio formae {:04b}, in lectione de nvmeris integris praesentata, valorem in binario qvattvor digitis scribit, cifris 0 completis.

Programma in C++
#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);}
Exitvs
a     = 1100 = 12b     = 1010 = 10a & b = 1000 = 8a | b = 1110 = 14a ^ b = 0110 = 6~a    = -13

Vltimvs 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 −x=∼x+1-x = {\sim}x + 1; ergo ∼x=−x−1{\sim}x = -x - 1, et ~12 valet −13-13. 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 −6-6, 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.