Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Complemento a due

Ragazzi, ho cercato so google ma non ho trovato nulla.
Comne posso fare un complemento a due di un numero binario (ripeto BINARIO)
La formula sarebe 2^m-nbin..
Es.
Di 1101 prendo 5 bit e faccio
10000 - 1101 (in binario) oppure NOT bit per bit (complemento a uno) + 1
1101 => 0010 +1 =0011
In VB non esiste un tipo binario, quindi che faccio?
Grazie
Ciao
--
Timothy Redaelli
P.S. X ASSA Se ti serve un collaboratore ci sono...


Scusa, vuoi dire che tu hai, per dire, "0011101001" e vuoi farne il
complemento a due?
' Codice
' Supponendo:
' s = "0011101001" o altra sequenza di 0 e 1
Function TwosComplement(ByVal s as String) As String
    Dim n As Long
    s = ZeroPad(s)
    s = BinToHex(s)
    n = CLng("&H" & s)
    n = -n
    s = Hex(n)
    TwosComplement = HexToBin(s)
End Sub
' Converte una stringa esadecimale in una stringa binaria
Function HexToBin(s As String) As String
    Dim t As String, I As Long
    For I = 1 To Len(s)
        Select Case UCase(Mid(s, I))
            Case "0"
                t = t & "0000"
            Case "1"
                t = t & "0001"
            Case "2"
                t = t & "0010"
            Case "3"
                t = t & "0011"
            Case "4"
                t = t & "0100"
            Case "5"
                t = t & "0101"
            Case "6"
                t = t & "0110"
            Case "7"
                t = t & "0111"
            Case "8"
                t = t & "1000"
            Case "9"
                t = t & "1001"
            Case "A"
                t = t & "1010"
            Case "B"
                t = t & "1011"
            Case "C"
                t = t & "1100"
            Case "D"
                t = t & "1101"
            Case "E"
                t = t & "1110"
            Case "F"
                t = t & "1111"
            Case Else
                Err Raise -1 ' Cambiare codice di errore
        End Select
    Next
    HexToBin = t
End Function
' Converte una stringa binaria in una stringa esadecimale
' La stringa deve essere zero-padded cosi' che Len(s) Mod 4 = 0.
Function BinToHex(s As String) As String
    Dim t As String, I As Long
    For I = 1 To Len(s) Step 4
        Select Case UCase(Mid(s, I, 4))
            Case "0000"
                t = t & "0"
            Case "0001"
                t = t & "1"
            Case "0010"
                t = t & "2"
            Case "0011"
                t = t & "3"
            Case "0100"
                t = t & "4"
            Case "0101"
                t = t & "5"
            Case "0110"
                t = t & "6"
            Case "0111"
                t = t & "7"
            Case "1000"
                t = t & "8"
            Case "1001"
                t = t & "9"
            Case "1010"
                t = t & "A"
            Case "1011"
                t = t & "B"
            Case "1100"
                t = t & "C"
            Case "1101"
                t = t & "D"
            Case "1110"
                t = t & "E"
            Case "1111"
                t = t & "F"
            Case Else
                Err Raise -1 ' Cambiare codice di errore
        End Select
    Next
End Function
' Aggiunge leading zeroes ad una stringa in
' modo che sia allineata a 4 caratteri
Function ZeroPad(s As String) As String
    ZeroPad = String$((Len(s) Mod 4), "0") & s
End Function
' Fine codice
Non testato ma ad occhio dovrebbe andare
Ciaotutti,
*

> In VB non esiste un tipo binario, quindi che faccio?
ti fai una funzione che trasforma il numero in binario -> Decimale e
Decimale -> Binario
poi con il  numerobinario fai il complemento a 2 .....
CIAO


Dimenticavo, ha il limite di un Long come dimensione della stringa binaria
(32 bit = 32 caratteri) e allo stesso modo ritorna una stringa SEMPRE lunga
32 caratteri.
Ciaotutti,
*

 ha scritto nel messaggio
news:a3e964$17m9r1$1...@ID-68324.news.dfncis.de...

No, ti sbagli 32 bit = Max 4,294,967,296 ovvero 10 cifre..
Grazie, non ci avevo pensato di usare l'HEX....
Ciao
--
Timothy Redaelli

 Non testato ma ad occhio dovrebbe andare
+o-
Grazie Mille
Ciao
--
Timothy Redaelli

 Comne posso fare un complemento a due di un numero binario (ripeto
BINARIO)
Private Function comp2(s As String) As String
 Dim a As String
 Dim n As Integer
    'Inverti i bit
    a = Replace(Replace(Replace(s, "1", "*"), "0", "1"), "*", "0")
    'aggiungi 1 (da destra: tutti gli 1 diventano 0 fino a che il riporto
    'si interrompe al primo 0)
    For n = Len(a) To 1 Step -1
        If Mid(a, n, 1) = "0" Then
            Mid$(a, n, 1) = "1"
            Exit For
        Else
            Mid$(a, n, 1) = "0"
        End If
    Next n
    If Val(a) = 0 Then a = "1" & a
    comp2 = a
End Function
Se si vuole fare il complemento con un numero prefissato di bit, basta
premettere degli 0 al numero di partenza:
Es.: comp2("00101")="11011"
Se si vogliono invece scartare gli zeri non significativi basta usare
CStr(Val())
Ciao, Silv:o)

 In VB non esiste un tipo binario, quindi che faccio?
Ho visto che ti hanno già risposto, comunque sul sito comune c'è un bel
modulo per gestire le operazioni su numeri binari:
http://www.it-lang-vb.net/download.asp?file=Archivio/Sorgenti/Binary.zip&ID=
108
Non c'è il complemento a 2, ma con le operazioni contenute nel modulo è
facilmente implementabile.
Ciao
*Roby*

 ha scritto nel messaggio
news:9IA68.17818$3J1.5...@news2.tin.it...

L'avevo già scaricato tempo fa (6 mesi c.rca)....
Il problema non era trasformare da decimale a binario (dividi per due e
pigli il resto) era la somma finale + 1
Ciao
--
Timothy Redaelli

 writes:
T> Ragazzi, ho cercato so google ma non ho trovato nulla.
T> Comne posso fare un complemento a due di un numero binario (ripeto BINARIO)
T> La formula sarebe 2^m-nbin..
T> Es.
T> Di 1101 prendo 5 bit e faccio
T> 10000 - 1101 (in binario) oppure NOT bit per bit (complemento a uno) + 1
T> 1101 => 0010 +1 =0011
T> In VB non esiste un tipo binario, quindi che faccio?
Non e` vero che non esiste. Con gli operatori logici And, Or, Not e Xor
puoi picchiare direttamente sui bit di una variabile di tipo int o long.
Nel caso particolare il complemento a 2 si puo` calcolare cosi`:
 
    twocomp = (i Xor &HFFFFFFFF) + 1
 
Gian Uberto Lauri               "Bloody instructions which, being taught, 
sa...@eng.it
                     return to plague their inventor" 
C.so Stati Uniti 23              ("Macbeth", Atto 1, Scena 7; Hacker Jargon
Tel: 
+39 049 828 3556
             File 4.0.0, voce: Programming, 1)

 writes:
T> Ragazzi, ho cercato so google ma non ho trovato nulla.
T> Comne posso fare un complemento a due di un numero binario (ripeto BINARIO)
T> La formula sarebe 2^m-nbin..
T> Es.
T> Di 1101 prendo 5 bit e faccio
T> 10000 - 1101 (in binario) oppure NOT bit per bit (complemento a uno) + 1
T> 1101 => 0010 +1 =0011
T> In VB non esiste un tipo binario, quindi che faccio?
Non e` vero che non esiste. Con gli operatori logici And, Or, Not e Xor
puoi picchiare direttamente sui bit di una variabile di tipo int o long.
Nel caso particolare il complemento a 2 si puo` calcolare cosi`:
 
    twocomp = (i Xor &HFFFFFFFF) + 1
-- 
Gian  | main(){printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}
Uberto|                        David Korn, 1987 ioccc best one liner 
Lauri |-------------------------------------------------------------------
(aka saint) >>Vedere X-Nospam nell'header - See X-Nospam field in Header<<


Eh??? 32 bit = max 11111111111111111111111111111111, 32 caratteri (cifre
binarie)...
Ciaotutti,
*