> Private m_nCount As Long
Private m_nLookupByte() As Long
Private Sub Class_Initialize()
Dim v As Variant
Dim i As Long
ReDim m_nLookupByte(0 To 255) As Long
' tableau de valeurs précalculées
v = Array(0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3,
3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, _
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4,
4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, _
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4,
4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, _
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5,
5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, _
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4,
4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, _
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5,
5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, _
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5,
5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, _
3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6,
6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8)
' on le copie dans un tableau fortement typé..
' je sais.. j'suis maniaque.. ;O)
For i = 0 To 255
m_nLookupByte(i) = v(i)
Next
End Sub
Public Function GetByteBitCount(ByVal b As Byte) As Long
GetByteBitCount = m_nLookupByte(b)
End Function
Public Function GetWordBitCount(ByVal w As Integer) As Long
GetWordBitCount = GetByteBitCount(HIBYTE(w)) +
GetByteBitCount(LOBYTE(w))
End Function
Public Function GetDWordBitCount(ByVal dw As Long) As Long
GetDWordBitCount = GetWordBitCount(HIWORD(dw)) +
GetWordBitCount(LOWORD(dw))
End Function
Private Function HIBYTE(ByVal w As Integer) As Byte
HIBYTE = (w And &HFF00&) &H100&
End Function
Private Function LOBYTE(ByVal w As Integer) As Byte
LOBYTE = w And &HFF&
End Function
Private Function HIWORD(ByVal dw As Long) As Integer
HIWORD = (dw And &HFFFF0000) &H10000
End Function
Private Function LOWORD(ByVal dw As Long) As Integer
If (dw And &H8000&) Then
LOWORD = dw Or &HFFFF0000
Else
LOWORD = dw And &HFFFF&
End If
End Function
'***
--
Cordialement
Yanick
MVP pour Visual Basic
"Clive" a écrit dans le message de
news:
Bonjour TLM,
Pour les besoins de mon logiciel de Sudoku, j'ai besoin de "compter"
les bits d'un entier (je stocke des possibilités de 0 à 511 sur le 9
premiers bits d'un entier).
Je sais le faire avec un boucle et un AND dans le style :
I = 0 TO 8; If (2^I) AND MonInteger then Bits=Bits+1
Mais je me demande s'il n'y a pas un moyen plus rapide (ou plus
élégant) de le faire. (Ancien programmeur APL, je regrette l'absence
de ce genre de manipulation de vecteurs dans VB).
Des idées svp ?
Merci d'avance
Clive
> Private m_nCount As Long
Private m_nLookupByte() As Long
Private Sub Class_Initialize()
Dim v As Variant
Dim i As Long
ReDim m_nLookupByte(0 To 255) As Long
' tableau de valeurs précalculées
v = Array(0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3,
3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, _
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4,
4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, _
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4,
4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, _
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5,
5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, _
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4,
4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, _
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5,
5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, _
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5,
5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, _
3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6,
6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8)
' on le copie dans un tableau fortement typé..
' je sais.. j'suis maniaque.. ;O)
For i = 0 To 255
m_nLookupByte(i) = v(i)
Next
End Sub
Public Function GetByteBitCount(ByVal b As Byte) As Long
GetByteBitCount = m_nLookupByte(b)
End Function
Public Function GetWordBitCount(ByVal w As Integer) As Long
GetWordBitCount = GetByteBitCount(HIBYTE(w)) +
GetByteBitCount(LOBYTE(w))
End Function
Public Function GetDWordBitCount(ByVal dw As Long) As Long
GetDWordBitCount = GetWordBitCount(HIWORD(dw)) +
GetWordBitCount(LOWORD(dw))
End Function
Private Function HIBYTE(ByVal w As Integer) As Byte
HIBYTE = (w And &HFF00&) &H100&
End Function
Private Function LOBYTE(ByVal w As Integer) As Byte
LOBYTE = w And &HFF&
End Function
Private Function HIWORD(ByVal dw As Long) As Integer
HIWORD = (dw And &HFFFF0000) &H10000
End Function
Private Function LOWORD(ByVal dw As Long) As Integer
If (dw And &H8000&) Then
LOWORD = dw Or &HFFFF0000
Else
LOWORD = dw And &HFFFF&
End If
End Function
'***
--
Cordialement
Yanick
MVP pour Visual Basic
"Clive" <clumb@free.fr> a écrit dans le message de
news:1119604148.330841.201940@g47g2000cwa.googlegroups.com...
Bonjour TLM,
Pour les besoins de mon logiciel de Sudoku, j'ai besoin de "compter"
les bits d'un entier (je stocke des possibilités de 0 à 511 sur le 9
premiers bits d'un entier).
Je sais le faire avec un boucle et un AND dans le style :
I = 0 TO 8; If (2^I) AND MonInteger then Bits=Bits+1
Mais je me demande s'il n'y a pas un moyen plus rapide (ou plus
élégant) de le faire. (Ancien programmeur APL, je regrette l'absence
de ce genre de manipulation de vecteurs dans VB).
Des idées svp ?
Merci d'avance
Clive
> Private m_nCount As Long
Private m_nLookupByte() As Long
Private Sub Class_Initialize()
Dim v As Variant
Dim i As Long
ReDim m_nLookupByte(0 To 255) As Long
' tableau de valeurs précalculées
v = Array(0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3,
3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, _
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4,
4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, _
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4,
4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, _
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5,
5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, _
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4,
4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, _
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5,
5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, _
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5,
5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, _
3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6,
6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8)
' on le copie dans un tableau fortement typé..
' je sais.. j'suis maniaque.. ;O)
For i = 0 To 255
m_nLookupByte(i) = v(i)
Next
End Sub
Public Function GetByteBitCount(ByVal b As Byte) As Long
GetByteBitCount = m_nLookupByte(b)
End Function
Public Function GetWordBitCount(ByVal w As Integer) As Long
GetWordBitCount = GetByteBitCount(HIBYTE(w)) +
GetByteBitCount(LOBYTE(w))
End Function
Public Function GetDWordBitCount(ByVal dw As Long) As Long
GetDWordBitCount = GetWordBitCount(HIWORD(dw)) +
GetWordBitCount(LOWORD(dw))
End Function
Private Function HIBYTE(ByVal w As Integer) As Byte
HIBYTE = (w And &HFF00&) &H100&
End Function
Private Function LOBYTE(ByVal w As Integer) As Byte
LOBYTE = w And &HFF&
End Function
Private Function HIWORD(ByVal dw As Long) As Integer
HIWORD = (dw And &HFFFF0000) &H10000
End Function
Private Function LOWORD(ByVal dw As Long) As Integer
If (dw And &H8000&) Then
LOWORD = dw Or &HFFFF0000
Else
LOWORD = dw And &HFFFF&
End If
End Function
'***
--
Cordialement
Yanick
MVP pour Visual Basic
"Clive" a écrit dans le message de
news:
Bonjour TLM,
Pour les besoins de mon logiciel de Sudoku, j'ai besoin de "compter"
les bits d'un entier (je stocke des possibilités de 0 à 511 sur le 9
premiers bits d'un entier).
Je sais le faire avec un boucle et un AND dans le style :
I = 0 TO 8; If (2^I) AND MonInteger then Bits=Bits+1
Mais je me demande s'il n'y a pas un moyen plus rapide (ou plus
élégant) de le faire. (Ancien programmeur APL, je regrette l'absence
de ce genre de manipulation de vecteurs dans VB).
Des idées svp ?
Merci d'avance
Clive
> Private m_nCount As Long
> Private m_nCount As Long
> Private m_nCount As Long
Salut Clive ! :O)
Dans un autre ordre d'idée, tu pourrais te faire une "lookup table"
(valeurs précalculées).. j'imagine que c'est plus rapide à la longue
ex :
Salut Clive ! :O)
Dans un autre ordre d'idée, tu pourrais te faire une "lookup table"
(valeurs précalculées).. j'imagine que c'est plus rapide à la longue
ex :
Salut Clive ! :O)
Dans un autre ordre d'idée, tu pourrais te faire une "lookup table"
(valeurs précalculées).. j'imagine que c'est plus rapide à la longue
ex :
Afin de mettre en pratique le tutoriel de Jean-Marc (merci encore :O)
http://membres.lycos.fr/jeanmarcn/cvb/cetvb.htm
Afin de mettre en pratique le tutoriel de Jean-Marc (merci encore :O)
http://membres.lycos.fr/jeanmarcn/cvb/cetvb.htm
Afin de mettre en pratique le tutoriel de Jean-Marc (merci encore :O)
http://membres.lycos.fr/jeanmarcn/cvb/cetvb.htm
"Jean-Marc" a écrit dans le message de
news:42bdac95$0$13238$Hello,
bien entendu, on n'oubliera pas qu'aucune implémentation
raisonnable n'utiliserait la récursivité dans ce contexte.
Pour la petite histoire, voici les 2 fonctions qui
implémentent le très bon algorithme de Patrick:
^^^^^^^
rede caesari qua est caesari:
je voilais dire l'algo de Patrice !
"Jean-Marc" <NO_SPAM_jean_marc_n2@yahoo.fr> a écrit dans le message de
news:42bdac95$0$13238$ba620e4c@news.skynet.be...
Hello,
bien entendu, on n'oubliera pas qu'aucune implémentation
raisonnable n'utiliserait la récursivité dans ce contexte.
Pour la petite histoire, voici les 2 fonctions qui
implémentent le très bon algorithme de Patrick:
^^^^^^^
rede caesari qua est caesari:
je voilais dire l'algo de Patrice !
"Jean-Marc" a écrit dans le message de
news:42bdac95$0$13238$Hello,
bien entendu, on n'oubliera pas qu'aucune implémentation
raisonnable n'utiliserait la récursivité dans ce contexte.
Pour la petite histoire, voici les 2 fonctions qui
implémentent le très bon algorithme de Patrick:
^^^^^^^
rede caesari qua est caesari:
je voilais dire l'algo de Patrice !