Hur kan man göra för att ändrar ett decimal tal till binärt Så här gör jag. Förmodar att du menar heltal. Decimaltal är lite lurigare Tjaba, Så här gör du om du vill omvandla 2 Byte / Integer SvenPons metod är bra mycket bättre än Anders Wikströms, såvida inte C# gör om 2^i som bit-shift. Tack för tipsen Sven Åke och Niklas. Nu är ju detta inte "mitt" inlägg men jag tar tacksamt emot det förbättringsförslag som presenterats. Jag har därför muppad min rutin till följande som jag nu tror (???) är hyfsat effektiv: För en fix size så är det nog det mest effektiva som går att uppnå, ja! Niklas lösning ser genial ut ! Men jag får den inte att ge rätt svar att 237 blir 11101101 Ja, det var lite snurrigt på både ett och två och tre sätt. Korrekt är: Det är ju genialt .Rekursivt anrop när det är som bäst. Sven: Om du är intresserad av att koll om den (kanske) lite mer effektiva metoden, är mer effektiv så är idén något i stil med: mmm... också en lösning.En annan lösning jag tycker Ni skall kolla på ärHur ändrar jag ett decimal tal till binärt
tex 237 till 11101101Sv: Hur ändrar jag ett decimal tal till binärt
<code>
Option Explicit
Private Sub Command1_Click()
MsgBox BitConv(237) 'Test med 237
End Sub
Private Function BitConv(ByVal inByte As Byte) As String
Dim i As Long, helB As Byte, strTemp As String
helB = 128
For i = 8 To 1 Step -1
If inByte Mod helB = inByte Then
strTemp = strTemp & "0"
Else
strTemp = strTemp & "1"
inByte = inByte - helB
End If
helB = helB \ 2
Next 'i
BitConv = strTemp
End Function
</code>Sv: Hur ändrar jag ett decimal tal till binärt
Jag har en liten snurra för att göra det du önskar. Den är skriven i C#, men du fattar säkert ändå vad den gör. Men, förmodligen finns det effektivare sätt att göra detta på:
static string ToBinaryString(byte value)
{
StringBuilder builder = new StringBuilder(8);
for (int i = 7; i >= 0; i--)
{
if ((value & (byte) Math.Pow(2, i)) > 0)
builder.Append("1");
else
builder.Append("0");
}
return builder.ToString();
}
Sv:Hur ändrar jag ett decimal tal till binärt
<code>
Option Explicit
Private Sub Command1_Click()
MsgBox BitConv(22300)
End Sub
Private Function BitConv(ByVal inInt As Long) As String
Dim i As Long, helInt As Long, strTemp As String
helInt = 32768
For i = 16 To 1 Step -1
If inInt Mod helInt = inInt Then
strTemp = strTemp & "0"
Else
strTemp = strTemp & "1"
inInt = inInt - helInt
End If
helInt = helInt \ 2
Next 'i
BitConv = strTemp
End Function
</code>Sv: Hur ändrar jag ett decimal tal till binärt
Strängutökningen kan ta tid, men har man tur så är det en bra algoritm, så att det går ganska snabbt.
Men Svenpons metod kan göras aningen mer generell:
<code>
Public Function ByteToBitString (ByVal x As [...]) As String ' [...] är valfri typ
if x=0
ByteToBitString = "0"
elseif x=1
ByteToBitString = "1"
Else
ByteToBitString = IIf(x mod 2, "0", "1") & ByteToBitString (x/2)
End Function
</code>
Med reservation för att jag har satt "0" och "1" i fel ordning i IIF-en.
Det kan ytterligare snabbas upp genom att använda if-sats istället för IIF, och ytterligare en del genom att vända ordningen till
ByteToBitString (x/2) & IIf(x mod 2, "0", "1")
Och sist reversera strängen.
Bara en detalj.Sv:Hur ändrar jag ett decimal tal till binärt
static string ToBinaryString(UInt64 value, int size)
{
StringBuilder builder = new StringBuilder(size);
UInt64 mask = (UInt64) 1 << size - 1;
for (int i = size; i > 0; i--)
{
if ((value & mask) > 0)
{
builder.Append("1");
}
else
{
builder.Append("0");
}
mask >>= 1;
}
return builder.ToString();
}
Sv: Hur ändrar jag ett decimal tal till binärt
Enda problemet är i så fall att räkna ut size, och det får man göra med logaritmer (vilket i praktiken blir en eller två Taylor-utvecklingar, som i sin tur kan ta lång tid på sig).
Sen är det ju iofs så att det här är VB (ej .NET)-forumet, och där saknas tyvärr bitshiftoperatorn.
Däremot skulle man kunna göra en array med int:ar eller long:ar där man bara sätter en bit, och sen använda den med Or och And, eftersom de dock är bitwise.Sv:Hur ändrar jag ett decimal tal till binärt
Koden nedan ger 010101111 dvs 9 tecken som är fel.
<code>
Option Explicit
Private Sub Command1_Click()
'237 till 11101101
MsgBox ByteToBitString(237)
End Sub
Private Function ByteToBitString(ByVal x As Byte) As String
If x = 0 Then
ByteToBitString = "0"
ElseIf x = 1 Then
ByteToBitString = "1"
Else
ByteToBitString = IIf(x Mod 2, "0", "1") & ByteToBitString(x / 2)
End If
End Function
</code>Sv: Hur ändrar jag ett decimal tal till binärt
<code>
Private Function ByteToBitString(ByVal x As Byte) As String
If x = 0 Then
ByteToBitString = "0"
ElseIf x = 1 Then
ByteToBitString = "1"
Else
ByteToBitString = ByteToBitString(x \ 2) & IIf(x Mod 2, "1", "0")
End If
End Function
</code>Sv:Hur ändrar jag ett decimal tal till binärt
Till Eugen detta är den optimala lösningen använd den här med tack till Niklas
<code>
Option Explicit
Private Sub Command1_Click()
MsgBox ByteToBitStr(237) 'Testa mot frågan 237
'Du kan testa vilket tal du vill dvs tal som är upp till Long max
End Sub
Private Function ByteToBitStr(ByVal inLng As Long) As String
Select Case inLng
Case Is = 0
ByteToBitStr = "0"
Case Is = 1
ByteToBitStr = "1"
Case Else
ByteToBitStr = ByteToBitStr(inLng \ 2) & IIf(inLng Mod 2, "1", "0")
End Select
End Function
</code>Sv: Hur ändrar jag ett decimal tal till binärt
<code>
'Det här får vara i en egen modul.
Private Bitmask (0 to 7) As Byte
Private initialized As Boolean
Public Function ByteToBitStr (Byte x) As String
if not initialized then initialize
dim i as integer
for i=7 to 0 step -1
if (x and BitMask(i)) then
ByteToBitStr = ByteToBitStr & "1"
else
ByteToBitStr = ByteToBitStr & "0"
end if
next i
end function
public sub initialize()
dim currentnumber as integer, i as integer
currentnumber=1
for i=0 to 7
Bitmask(i) = currentnumber
currentnumber=currentnumber*2
next
initialized=true
end sub
</code>
Man gör alltså en sekvens av bitmaskar 00000001, 00000010, ..., 10000000.
Sen 'and'-ar man dem mot talet, blir svaret noll så är den biten en 0:a, blir svaret skilt ifrån 0 så är den biten en 1:a.Sv:Hur ändrar jag ett decimal tal till binärt
Stefan Nilsson:s utmärkta Programarkivet:Konverterare för ASCII, Byte, Bit, CHR$