Int.countOneBits în Kotlin

Numără câți biți de 1 are un număr în scrierea binară (de exemplu 7 = 111 are 3).

Sintaxă
fun Int.countOneBits(): Int
fun Int.countLeadingZeroBits(): Int
fun Int.countTrailingZeroBits(): Int

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ă.