# Convert Dec to Binary - but Ones and Zeros

## Recommended Posts

Hi All,

Trying to convert a number to binary zeros and ones but I'm getting a result I don't understand and looks more like hex than binary.

Here's my basic code:

```\$myNum = 11
\$myNumBin = Binary(\$myNum)
MsgBox(0, "Binary result", \$myNumBin)```

What I want is "1011", what I get is 0x0B000000.

Thanks!

Edited by WoodGrain
Wrong syntax
##### Share on other sites

Try this:

```MsgBox(0, "", DecToBase(11, 2))

Func DecToBase(\$iInt, \$iBase) ; for bases 2 to 9
Local \$iRem, \$sRet = ''
While \$iInt > \$iBase -1
\$iRem = Mod(\$iInt, \$iBase)
\$sRet = \$iRem & \$sRet
\$iInt = Int((\$iInt - \$iRem) /\$iBase)
WEnd
Return \$iInt & \$sRet
EndFunc ;==> DecToBase```

To reverse the process you can use this:

```MsgBox(0, "", BaseToDec('1011', 2))

Func BaseToDec(\$sInt, \$iBase) ; bases 2 to 9 only
Local \$iRet = 0, \$iLen = StringLen(\$sInt)
For \$i = 1 To \$iLen
\$iRet += StringMid(\$sInt, \$i, 1) * \$iBase ^ (\$iLen - \$i)
Next
Return \$iRet
EndFunc ;==> BaseToDec```

Edited by czardas
##### Share on other sites

That worked perfectly, thanks!

I note it does bases 2 - 9, would it be complex to allow up to base 16 so I can convert it to hex as well?

##### Share on other sites

It's not so complicated, but unless you need bases 11 to 15, you might as well use Hex() and Dec(). I don't have much time this morning. You could try this old code of mine:
http://www.czardas.co.uk/repository/math10.au3

The code I posted in this thread can also be modified to convert larger numbers (up to Int64) by replacing the operators with operator64 functions (see my signature). Currently, these conversion functions only work for doubles ~ up to 15 decimal digits.

Edited by czardas
##### Share on other sites

No worries, thanks very much.

Actually, yeah, hex() works as expected

```\$myNum = 30
\$myNumHex = Hex(\$myNum, 2)
MsgBox(0, "Hex result", \$myNumHex)```

Returns 1E

Edited by WoodGrain
Update after testing
##### Share on other sites
18 hours ago, czardas said:

\$iInt = Int((\$iInt - \$iRem) /\$iBase)

This line could be written like this with no change in output.

`\$iInt = Int(\$iInt / \$iBase)`

If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.
Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag Gude
How to ask questions the smart way!

I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from.

Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays.  -  ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script.  -  Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label.  -  _FileGetProperty - Retrieve the properties of a file  -  SciTE Toolbar - A toolbar demo for use with the SciTE editor  -  GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI.  -   Latin Square password generator

##### Share on other sites

@BrewManNH Well spotted! By all means change it.

Instead of that, if I implement Operator64 functions, Int() could be removed. It should not really be needed here neither, but because of rounding inaccuracies, I added it to be on the safe side. That's also why I decided on division by a real factor (subtracting the remainder first): I don't trust double precision to always return an accurate result.

It's a while since I wrote this and I'm trying to remember everything I was thinking at the time. I must have written it that way because of the aforementioned reasons.

Edited by czardas
##### Share on other sites

I have modified this method to be compatible with all numbers within the positive Int64 range. This example requires operator64.au3 (see link in my signature).

CODE MOVED HERE:

Edited by czardas

## Create an account or sign in to comment

You need to be a member in order to leave a comment

## Create an account

Sign up for a new account in our community. It's easy!

Register a new account

• ### Similar Content

• Func _Binary(\$Int) ;Uncomment To Only Accept Integers #cs If IsInt(\$Int) = 0 Then Return 0 EndIf #ce If \$Int < 0 Then ;Negative Numbers Will Break The Function Return 0000 EndIf Local \$Integer = \$Int Dim \$Bin[1] = [Mod(\$Integer, 2)] Local \$Counter = 1 Do \$Integer = Floor(\$Integer / 2) _ArrayAdd(\$Bin, Mod(\$Integer, 2)) Until \$Integer = 0 _ArrayReverse(\$Bin) ;Reverses The Array Because As Is, The Product Is Backwards ;A Loop To Remove Any Preceding 0's or Add 0's To Keep At Least Four Digits Select Case \$Int <= 1 \$Integer = "00" & _ArrayToString(\$Bin, "") Case \$Int = 2 Or \$Int = 3 \$Integer = "0" & _ArrayToString(\$Bin, "") Case \$Int >= 8 \$Integer = StringTrimLeft(_ArrayToString(\$Bin, ""), 1) Case Else \$Integer = _ArrayToString(\$Bin, "") EndSelect ;You Can Comment It Out Without Anything Else Having A Problem Return \$Integer EndFunc I made this because I was writing something that I could use to play with Bitwise Operations and using Binary() by itself wasn't helping.
It's very basic and will only take positive integers because that's all I needed but I'm sure with a little tweaking you could make it fit with negative and float types.
It returns a string essentially but doesn't pose a problem when just changing numbers into binary digits.
Example: If you were to do _Binary(5) you would get "0101" and _Binary(8) would return "1000"
Between this last sentence and here I've changed this about a half dozen times to refine it a bit because without it checking if your number is < 0 it would break if a negative number was inserted and it wouldn't even have a problem if you put in Float Values, Regular or Special Characters but that negative value will do the trick lol.
Anyway, I hope someone finds some use of this and thank you for reading!
-Pick

• Hi AutoIt Programmers, i wanna figure out how to use Binary functions in C# like:

BinaryMid
BinaryLen
IsBinary and other basic ones were too ez, but those two were hard to noob like me.

I appreciate for your helps/hints.

• hey, I'm trying to convert a PNG and a JPG file into a CUR file in Autoit. Does anyone have a role there? I couldn't find anything
• By jmor
For some reason, I can't convert to Hex a Decimal color that has been calculated.
For example, this works:
Local \$iColor = 3310546 ConsoleWrite("\$iColor (dec): " & \$iColor & ", \$iColor (hex): " & Hex(\$iColor, 6) & @CRLF) giving the expected output:
\$iColor (dec): 3310546, \$iColor (hex): 3283D2
But if I want to take an average of several colors, I have a problem.  For example this doesn't work:
\$iColor = (3310546 + 3310546) / 2 ConsoleWrite("\$iColor (dec): " & \$iColor & ", \$iColor (hex): " & Hex(\$iColor, 6) & @CRLF) giving the wrong output:
\$iColor (dec): 3310546, \$iColor (hex): 000000
I observe this behavior after any processing of a decimal color.
Is this a bug?

• hello autoit team
please i've a question for you.
am creating a audio player
and in this audio player i want to show the current trac info
such as the total time and the position ... etc
i know i can show it as label
but the screen reader for the blind read the text every change
because it have a screen scan
what i want is to show this informations but such image or icon
i mean i need to create
GUICtrlCreatepic or GUICtrlCreateicon ....
or some thing as that
and show this informations as image on it
i think that i can do that with the
_GDIPlus functions
but i couldn't find the currect way to do it
i tried the _GDIPlus_GraphicsDrawString
but i couldn't know how it work
what i need is a small example that create a GUI
and add a multy line text to it as graphic or image.
so i need a simple way because it will changed every sec
i hope any one can help me to do that
global \$GUI = GUICreate("text", 400, 400) global \$label = GUICtrlCreateLabel(GetText(), 10, 10, 380, 380) GUISetState() do sleep(100) until GUIGetMSG() = -3 exit func GetText() return StringFormat("file name is test.mp3 \r\n total time is 00:30:00 \r\n position is 00:05:50") endFunc
×

• Wiki

• Back

• #### Beta

• Git
• FAQ
• Our Picks
×
• Create New...