Sapere quanti bit posti ad 1 sono presenti in un numero

Da Gambas-it.org - Wikipedia.

Per sapere quanti bit posti ad 1 sono presenti in un numero, è possibile utilizzare alcune modalità.


Uso della funzione specifica BTst( )

Innanzitutto mostriamo una soluzione semplice utilizzando la funzione specifica BTst( ): [nota 1]

Public Sub Main()
 
 Dim numero, i, bitauno As Byte
 
  numero = 165
  
  For i = 0 To 7
    If BTst(numero, i) = True Then Inc bitauno
  Next
  
  Print "Il numero di bit a uno è: "; bitauno
  
End

Per valori superiori al Byte

Public Sub Main()   [nota 2]

 Dim numero As Long
 Dim i, nbit, bitauno As Byte
 
  numero = 23750
  nbit = CByte(Log2(numero) + 1)
  
  For i = 0 To nbit
    If BTst(numero, i) = True Then Inc bitauno
  Next
  
  Print "Il numero di bit a 1 è: "; bitauno
  
End


Uso delle funzioni Bin( ) e Mid( )

Public Sub Main()
 
 Dim i, numero, c As Integer
 Dim binario As String
 
  numero = 1234567890
  binario = Bin(numero)
  
  For i = 1 To len(binario)
    If Mid(binario, i, 1) = "1" Then Inc c
  Next
  
  Print numero; " contiene "; c; " bit posti a 1  ("; binario; ")"
  
End


Uso dell'operatore aritmetico Mod

Public Sub Main()   [nota 3]
 
 Dim n, b, c As Integer
 Dim bb As New Byte[]
 
  n = 23750
  
  Print "La rappresentazione binaria di "; n; " è ";
  
  While n > 0
    b = n Mod 2
    bb.Push(b)
    If b <> 0 Then Inc c
    n = n \ 2
  Wend
  
  bb.Reverse()
  
  For b = 0 To bb.Max
    Print bb[b];
  Next
  
  Print " e contiene "; c; " bit a 1"
  
End


Mediante l'operatore AND e la funzione Lsl( )

Public Sub Main()
 
 Dim u As Byte
 Dim i, d As Integer
  
  i = 123456789
  
  For d = 31 To 0 Step -1
    If (i And Lsl(1, d)) > 0 Then
      Inc u
      Print "1";
    Else
      Print "0";
    Endif
  Next
  
  Print "\n\nIl numero \""; i; "\" contiene "; u; " bit posti a 1"
  
End



Note

[1] Questa soluzione è stata proposta dal membro TopFuel del forum www.gambas-it.org

[2] Questa soluzione è stata proposta dai membri Gianluigi e TopFuel del forum www.gambas-it.org

[3] Questa soluzione è stata proposta dal membro Gianluigi del forum www.gambas-it.org