Ce face Int.countOneBits
Orice întreg este memorat în binar, ca o secvență de 32 de biți. countOneBits() returnează câți dintre ei sunt 1: 7 este 111 în binar, deci rezultatul este 3. Pentru numere negative se numără biții din reprezentarea în complement față de doi, deci (-1).countOneBits() este 32.
Funcția este utilă când folosești un număr ca set de opțiuni (fiecare bit este o opțiune pornită sau oprită) și vrei să știi câte sunt active. Înrudite: countLeadingZeroBits() (zerourile din stânga) și countTrailingZeroBits() (zerourile din dreapta).
Ce returnează
Numărul de biți 1 (Int, între 0 și 32).
Exemple
Exemplul 1: Biți de 1 în câteva numere
Afișăm și scrierea binară, ca să se vadă biții numărați.
fun main() {
for (n in listOf(0, 7, 8, 255, -1)) {
println("$n = ${Integer.toBinaryString(n)} -> ${n.countOneBits()} biți de 1")
}
}
Rezultat
0 = 0 -> 0 biți de 1
7 = 111 -> 3 biți de 1
8 = 1000 -> 1 biți de 1
255 = 11111111 -> 8 biți de 1
-1 = 11111111111111111111111111111111 -> 32 biți de 1
Exemplul 2: Permisiuni stocate în biți
Fiecare permisiune este un bit. or le combină, iar countOneBits spune câte sunt active.
const val CITIRE = 1
const val SCRIERE = 2
const val STERGERE = 4
const val ADMIN = 8
fun main() {
val ana = CITIRE or SCRIERE
val ion = CITIRE or SCRIERE or STERGERE or ADMIN
println("Ana are ${ana.countOneBits()} permisiuni")
println("Ion are ${ion.countOneBits()} permisiuni")
println("Ana poate șterge: ${ana and STERGERE != 0}")
}
Rezultat
Ana are 2 permisiuni
Ion are 4 permisiuni
Ana poate șterge: false
Exemplul 3: Puteri ale lui 2
Un număr pozitiv este putere a lui 2 dacă are exact un bit de 1.
fun main() {
val puteri = (1..100).filter { it.countOneBits() == 1 }
println(puteri)
println(64.countTrailingZeroBits())
}
Rezultat
[1, 2, 4, 8, 16, 32, 64]
6
Greșeli frecvente
- Te aștepți la un rezultat mic pentru numere negative. Ele au mulți biți de 1 în complement față de doi:
(-1).countOneBits()este 32.
Comenzi înrudite
Int.toString: toString transformă un număr în text (opțional în altă bază, ca 2 sau 16); toChar dă caracterul cu acel cod.Int.rem: rem (operatorul %) dă restul împărțirii, cu semnul deîmpărțitului; mod dă restul cu semnul împărțitorului.Int.MAX_VALUE: Cea mai mare valoare pe care o poate ține un Int (2147483647); MIN_VALUE este cea mai mică.