Programming C, C++, Java, PHP, Ruby, Turing, VB
Computer Science Canada 
Programming C, C++, Java, PHP, Ruby, Turing, VB  

Username:   Password: 
 RegisterRegister   
 A few questions on binary addition
Index -> Programming, Turing -> Turing Help
View previous topic Printable versionDownload TopicSubscribe to this topicPrivate MessagesRefresh page View next topic
Author Message
Pa|2a|)oX




PostPosted: Wed Feb 16, 2005 8:54 pm   Post subject: A few questions on binary addition

Hello everyone, firstly I appreciate any feedback that you may have.

I have two problems. The program I am making is a binary addition program that takes any two binary values and adds them together. Certain variables in the program need to be interchanged between string and integer variables to get certain functions to work (i.e. length (), addition, and indexing var (x)).

To properly add two binary values together, I need both amounts to be equal length. The only way I have found of doing this is with string variables. However, I cannot add these values together in the string form, so I have to use strint to convert them into integers. The problem with strint is that it drops and leading zeros and just takes the significant digits of the string value (i.e. if the value is 00000010 it just takes 10).

Is there a way around this? I need to keep all the zeros.

The other thing is the addition of these integers. I cannot add strings which is a real pain in the but, because I cannot index an integer variable (I cannot query the variable to tell me what number is in x position).

With a string variable I can say:
put word1 (3)

but I cannot do the same with an integer.

Is there a way around this?

Thanks for any responses, I hope I made this as clear as possible to understand.

All the best,
Kostia
Sponsor
Sponsor
Sponsor
sponsor
Bacchus




PostPosted: Wed Feb 16, 2005 9:20 pm   Post subject: (No subject)

nope no way around, can index integers and cant add string (besides adding parts onto each other to make a longer string). my sugestion is to convert the binary number to regular count and add it that way before changing it back to binary.
Tony




PostPosted: Thu Feb 17, 2005 9:47 am   Post subject: (No subject)

Pa|2a|)oX : please use more descriptive titles (edited this for you, but next time follow the guidelines)

Bacchus : that was not very nice of you.

now to the questions..

indexing integers:
Turing:

function intIndex (number, i : int) : real
    result floor (((number / (10 ** i)) - floor (number / (10 ** i))) * 10)
end intIndex

var num : int := 12345678
for i : 1 .. 8
    put i, "th index of ", num, " is : ", intIndex (num, i)
end for


index starts from the right and it doesn't work for numbers over 9 digits in length. But if you're working with bytes (8 bits) you should be in the clear.

Ether way, if you're adding binary - work in binary. None of that fansy "watch me turn binary into string into integer back into string and finally back into binary" Ekk

Turing:

var binary1 : string := "0010" % binary 2
var binary2 : string := "0101" % binary 5

put strint (binary1, 2) + strint (binary2, 2)
%2 + 5 = 7
Pa|2a|)oX




PostPosted: Thu Feb 17, 2005 1:53 pm   Post subject: (No subject)

Thanks for your help. I got it to work.. Check it out.. used arrays.
code:


View.Set ("graphics:340;200,position:bottom;left,nobuttonbar")
drawfillbox (0, 0, maxx, maxy, black)
colorback (black)
color (yellow)
%Variable Declaration
var snum1, snum2 : string
%Get snum1, snum2
put "Please enter the first binary number.."
get snum1
put "Please enter the second binary number.."
get snum2
%Variable length of snum1,snum2
var lnum1 : int := length (snum1)
var lnum2 : int := length (snum2)

%Length of StringNum1 is Greater
procedure glnum1
    var dif : int := lnum1 - lnum2
    var lenum2 : string := snum2
    for x : 1 .. dif
        lenum2 := "0" + lenum2
    end for
    %%%%%%%%%%%
    var add1, add2 : array 1 .. lnum1 of int
    var final : array 1 .. lnum1 of int
    var fdigit : int := 0
    var carry : int := 0

    for i : 1 .. lnum1
        add1 (i) := strint (snum1 (i))
    end for
    for i : 1 .. lnum1
        add2 (i) := strint (lenum2 (i))
    end for

    for decreasing k : lnum1 .. 1
        if k = 1 and add1 (k) + add2 (k) = 0 and carry = 0 then
            fdigit := 0
        elsif k = 1 and add1 (k) + add2 (k) = 1 and carry = 0 then
            fdigit := 1
        elsif k = 1 and add1 (k) + add2 (k) = 1 and carry = 1 then
            fdigit := 10
        elsif k = 1 and add1 (k) + add2 (k) = 2 and carry = 0 then
            fdigit := 10
        elsif k = 1 and add1 (k) + add2 (k) = 2 and carry = 1 then
            fdigit := 11
        end if
        %%%%
        if add1 (k) + add2 (k) = 0 and carry = 0 then
            final (k) := 0
            carry := 0
        elsif add1 (k) + add2 (k) = 0 and carry = 1 then
            final (k) := 1
            carry := 0
        elsif add1 (k) + add2 (k) = 1 and carry = 0 then
            final (k) := 1
            carry := 0
        elsif add1 (k) + add2 (k) = 1 and carry = 1 then
            final (k) := 0
            carry := 1
        elsif add1 (k) + add2 (k) = 2 and carry = 0 then
            final (k) := 0
            carry := 1
        elsif add1 (k) + add2 (k) = 2 and carry = 1 then
            final (k) := 1
            carry := 1
        end if
    end for
    put "The addition these two values produce.."
    put fdigit ..
    if lnum1 > 1 then
        for t : 2 .. lnum1
            put final (t) ..
        end for
    end if

end glnum1

%Equal Amount
procedure glequal
    var add1, add2 : array 1 .. lnum1 of int
    var final : array 1 .. lnum1 of int
    var fdigit : int := 0
    var carry : int := 0

    for i : 1 .. lnum1
        add1 (i) := strint (snum1 (i))
    end for
    for i : 1 .. lnum2
        add2 (i) := strint (snum2 (i))
    end for

    for decreasing k : lnum1 .. 1
        if k = 1 and add1 (k) + add2 (k) = 0 and carry = 0 then
            fdigit := 0
        elsif k = 1 and add1 (k) + add2 (k) = 1 and carry = 0 then
            fdigit := 1
        elsif k = 1 and add1 (k) + add2 (k) = 1 and carry = 1 then
            fdigit := 10
        elsif k = 1 and add1 (k) + add2 (k) = 2 and carry = 0 then
            fdigit := 10
        elsif k = 1 and add1 (k) + add2 (k) = 2 and carry = 1 then
            fdigit := 11
        end if
        %%%%
        if add1 (k) + add2 (k) = 0 and carry = 0 then
            final (k) := 0
            carry := 0
        elsif add1 (k) + add2 (k) = 0 and carry = 1 then
            final (k) := 1
            carry := 0
        elsif add1 (k) + add2 (k) = 1 and carry = 0 then
            final (k) := 1
            carry := 0
        elsif add1 (k) + add2 (k) = 1 and carry = 1 then
            final (k) := 0
            carry := 1
        elsif add1 (k) + add2 (k) = 2 and carry = 0 then
            final (k) := 0
            carry := 1
        elsif add1 (k) + add2 (k) = 2 and carry = 1 then
            final (k) := 1
            carry := 1
        end if
    end for
    put "The addition these two values produce.."
    put fdigit ..
    if lnum1 > 1 then
        for t : 2 .. lnum1
            put final (t) ..
        end for
    end if
end glequal

%Procedure call
if lnum1 > lnum2 then
    glnum1
elsif lnum1 < lnum2 then
    put "Not correct arithmetic, second binary number must be smaller than the first."
else
    glequal
end if




Tony




PostPosted: Thu Feb 17, 2005 2:29 pm   Post subject: (No subject)

what's with the limitations? why must the second binary number be smaller than the first? Thinking

here's a minor modification
Turing:

View.Set ("graphics:340;200,position:bottom;left,nobuttonbar")
drawfillbox (0, 0, maxx, maxy, black)
colorback (black)
color (yellow)
%Variable Declaration
var snum1, snum2 : string
%Get snum1, snum2
loop
    put "Please enter the first binary number.."
    get snum1
    put "Please enter the second binary number.."
    get snum2

    put "The addition these two values produce.."
    put intstr (strint (snum1, 2) + strint (snum2, 2), length (intstr (strint (snum1, 2) + strint (snum2, 2))), 2)
end loop

Laughing
Bacchus




PostPosted: Thu Feb 17, 2005 4:03 pm   Post subject: (No subject)

tony wrote:
Bacchus : that was not very nice of you.

??? how was i not nice? he asked if there way to index integer and i didnt think there was a way so i said there wasnt. kno i kno there is, good idea on that. i still say it would be easier to just convert it to an accuall integer. but good none the less
Pa|2a|)oX




PostPosted: Thu Feb 17, 2005 4:06 pm   Post subject: (No subject)

The limitation was just a quick way of going around a small problem. I needed to finish it and I didn't have time to get finnicky with switching variables and such.

Thanks for your help and feedback. Next is the multiplication Smile

code:
loop
    put "Please enter the first binary number.."
    get snum1
    put "Please enter the second binary number.."
    get snum2

    put "The addition these two values produce.."
    put intstr (strint (snum1, 2) + strint (snum2, 2), length (intstr (strint (snum1, 2) + strint (snum2, 2))), 2)
end loop


Can I ask you what you did here? and how you bypassed all my other variables (i.e. fdigit and such). Seems to work, but its beyond me how it works.

*edit* Holy crap... you got my whole program to work in like 10 lines of code... Neutral That's not cool lol. wow.
Tony




PostPosted: Thu Feb 17, 2005 5:38 pm   Post subject: (No subject)

Bacchus: you should have said that you don't know of a way to do such. Only if you're sure because of a documented limitation.. anyways

Pa|2a|)oX: lookup (Turing -> F10) the functionality of strint() and intstr(). They have an option of working in a base of choice. If for example you were to replace all the , 2 to , 16 your program would be in hexadecimal mode. Wink

btw, there's some extra junk in there that I took out, but I guess it didn't edit.. replace length(...) with 0
Sponsor
Sponsor
Sponsor
sponsor
Pa|2a|)oX




PostPosted: Thu Feb 17, 2005 9:11 pm   Post subject: (No subject)

Thank Tony. However the teacher wouldn't accept that, he wanted there to be an algorythm for solving this problem, and not just using built in functions.

I'm actually quite proud that I got it to work like that Smile
Tony




PostPosted: Fri Feb 18, 2005 10:12 am   Post subject: (No subject)

Pa|2a|)oX wrote:
Thank Tony. However the teacher wouldn't accept that, he wanted there to be an algorythm for solving this problem, and not just using built in functions.

yeah.. I'm just being lazy (although in programming it is great thing)

do whatever you're doing. You can pull off a joke about how that is still cheating since you're not using assembly Wink And just use my code snippet to varify your results.
Display posts from previous:   
   Index -> Programming, Turing -> Turing Help
View previous topic Tell A FriendPrintable versionDownload TopicSubscribe to this topicPrivate MessagesRefresh page View next topic

Page 1 of 1  [ 10 Posts ]
Jump to:   


Style:  
Search: