Newsgroup: it.comp.lang.visual-basic
Titolo: [SFIDA] Bits...

 Allora comincio a prenderci gusto ehhehehe
 Dato un byte ( per brevità ), contare il numero di bit a 1.
 Ah naturalmente senza istruzioni iterattive o di salto incodizionato!
 
Ciao
 
--------------------------------
Inviato via 
http://usenet.libero.it

  Dato un byte ( per brevità ), contare il numero di bit a 1.
Function contabit(b As Byte)
    If (b <> 0) Then
        contabit = contabit(b \ 2) + (b Mod 2)
    Else
        contabit = 0
    End If
End Function
termoPilucco

*termopilucco* ha scritto ignorando completamente le regole!
Imho, nk (che non mi avrà mai più) le ha pure scritte in modo
equivocabile...


  Cosa significa "... nk (che non mi avrà mai più) )..." e poi cosa non ti è
chiaro scusa eh?


 *termopilucco* ha scritto ignorando completamente le regole!
mhhh... vediamo non dovevo usare:
1) istruzioni iterattive
qui si intende iterative: for, loop, do, while, goto
l'if non è iterativo.
2) Di salto incodizionato!
l'if è un salto condizionato.
l'unico salto incondizionato in Vb è il goto label
dov'è il problema?
termoPilucco

 ha
scritto:

  Carino! E l'alternativa ad una funzione ricorsiva?


 Dato un byte, contare il numero di bit a 1.
Private Function OneBitCount(ByVal b As Byte) As Integer
OneBitCount = IIf((b Or 1) = b, 1, 0) + _
              IIf((b Or 2) = b, 1, 0) + _
              IIf((b Or 4) = b, 1, 0) + _
              IIf((b Or 8) = b, 1, 0) + _
              IIf((b Or 16) = b, 1, 0) + _
              IIf((b Or 32) = b, 1, 0) + _
              IIf((b Or 64) = b, 1, 0) + _
              IIf((b Or 128) = b, 1, 0)
End Function
Lokar
--
Sito Comune: 
http://www.it-lang-vb.net/
Manifesto: 
http://www.it-lang-vb.net/docs/Manifesto.txt
UGIdotNET - 
http://www.ugidotnet.org

   Carino! E l'alternativa ad una funzione ricorsiva?
contabit = b Mod 2 + (b \ 2) Mod 2 + (b \ 4) Mod 2 + (b \ 8) Mod 2 + (b \
16) Mod 2 + (b \ 32) Mod 2 + (b \ 64) Mod 2 + (b \ 128) Mod 2
termoPilucco


 Bho...



  Preferivo la ricorsiva.



 Propongo la mia soluzione
 Dim a(3) As Byte
 Dim n As Byte
 n = 71
 a(0) = 0
 a(1) = 1
 a(2) = 1
 a(3) = 2
 Print a((n And 192) \ 64) + a((n And 48) \ 16) + a((n And 12) \ 4) + a(n And
3)
Ciaooo


<Lokar>
Private Function OneBitCount(ByVal b As Byte) As Integer
OneBitCount = CInt(True) * _
              (CInt((b Or 1) = b) + _
               CInt((b Or 2) = b) + _
               CInt((b Or 4) = b) + _
               CInt((b Or 8) = b) + _
               CInt((b Or 16) = b) + _
               CInt((b Or 32) = b) + _
               CInt((b Or 64) = b) + _
               CInt((b Or 128) = b))
End Function
</Lokar>
<termopillucco>
Private Function ContaBit(ByVal b As Byte) As Integer
ContaBit = b Mod 2 + _
          (b \ 2) Mod 2 + _
          (b \ 4) Mod 2 + _
          (b \ 8) Mod 2 + _
          (b \ 16) Mod 2 + _
          (b \ 32) Mod 2 + _
          (b \ 64) Mod 2 + _
          (b \ 128) Mod 2
End Function
</termopillucco>
La mia e' piu' veloce :)
Per 2.500.000 di iterazioni circa, impiega 4 secondi contro
i 6 di termopillucco.



  Eehehehehehe ma č poco elegante!!!! LOL
Ciao



  Azz!! Dispendiosa, pensa se il numero fosse a 32 bit o addirittura a 64 bit


  Print a((n And 192) \ 64) + _
         a((n And 48) \ 16) + _
         a((n And 12) \ 4) + a(n And 3)
E questa sarebbe elegante? Bof!
Comunque dato il tenore dei tuoi post, mi associo a Lupo e
mi defilo.
Goodbye.


  Propongo la mia soluzione
[...]
ma per n=255 non da il valroe esatto (8)
:)
termoPilucco


Ehi, la gara non era di velocità!
Altrimenti mi inventavo qualcosa d'altro. :)
termoPilucco

 :)
  Come no? 255 ha 8 bit a 1!!
  7 6 5 4 3 2 1 0
 128 64 32 16 8 4 2 1
  1 1 1 1 1 1 1 1 = 8bit a 1 = 255
 
Ciao


 Altrimenti mi inventavo qualcosa d'altro. :)
  Vero, ma un po di eleganza non guasta no.


 mi defilo.
  Meglio, altrimenti avresti capito che la mia soluzione non fondata sul
"print ..." che tu hai ingenuamente evidenziato ma sul fatto che ho usato
una tabella di lookup ( sempre che tu sappia cosa sia )
Ciao


   Vero, ma un po di eleganza non guasta no.
Certo che sta settimana non abbiamo proprio un casso da fare ^_________^