Page 1 of 2

binair to bits

Posted: Sat Feb 02, 2008 4:14 pm
by Seb McClouth
Hey all

I need to know how I can get the bit (yeah the 0-1) from a binairy value.

Does anyone have such a convertor in Basic?

And incase you must now, it's to retrieve AH and AL from AX. If you have a better way, please let me know.

Grtz

Re: binair to bits

Posted: Sat Feb 02, 2008 4:22 pm
by Mac
Seb McClouth wrote: from a binairy value.
What do you want to get binary values from?

A single, an integer, a string*1, etc.?

For example, I have input a character K$. I would like a function like this:

PRINT BIT(k$,3)

and I expect it to return 0 or 1 of bit 3.

Is that what you want?

Mac

This Bit of my knowledge:

Posted: Sat Feb 02, 2008 5:41 pm
by burger2227
Binary bits are calculated in AH and AL as a total of 16 bits. The QB Integer byte value also is 2 bytes.

Code: Select all

                     AH                            AL
 bit     (15) 14 13 12 11 10 9 8         7  6  5  4  3  2  1  0

 Values      32767  to 256                      255 to 1
Each is an exponent of 2 ^ bit so Bit0 = 2 ^ 0 = 1 etc.

So lets say bits 3 and 4 are set or on:

Code: Select all

bitset = 2 ^ 3 + 2 ^ 4 = 8 + 16 = 24        ' 00011000 in binary
Bit 15 goes beyond the Integer allowance in QB and is normally not used as bits are defined as normal integers. This can be used to read or write port bit settings such as the 8 bit parallel data port. In fact even the pins are called D0 to D7.

The same values are found converting Binary numbers to decimal.

Now to see if a bit is on, just use the AND mathmatical function:

Code: Select all

IF TotalByteValue AND 16 THEN PRINT "Bit 4 is on"
Using AND will return 16 also, so you can divide by 16 to get a 1 if needed, but it is not really necessary. You can do a total byte value up to 255 using a FOR i = 0 TO 7 and comparing the bits with 2 ^ i.

Ted

Posted: Mon Feb 04, 2008 9:40 pm
by Patz QuickBASIC Creations
Burger's way pretty much shows it in a nutshell. Pretty much, once you have the variable loaded, you can use one of the bitwise-operators to manipulate it.

Here's another example. Say that Bit 0 controls whether a certain action is done or not. You can toggle it many different ways.

Code: Select all

OurValue% = 1    'Bit 0 is TRUE

'To change Bit 0 to FALSE (0)
OurValue% = OurValue% AND 254   '11111110

'To toggle the value of Bit 0
OurValue% = OurValue% XOR 1   '00000001

To change Bit 0 to TRUE (1)
OurValue% = OurValue% OR 1

Hum de dumb

Posted: Mon Feb 04, 2008 10:04 pm
by burger2227
It appears that Sebby has better things to do than reply to our posts.

So I won't bother with that dude no more!

Ted

Re: Hum de dumb

Posted: Mon Feb 04, 2008 11:16 pm
by BDZ
burger2227 wrote:It appears that Sebby has better things to do than reply to our posts.

So I won't bother with that dude no more!

Ted
Maybe you just answered his question so well he didn't want to insult your superior intellect by adding anything more to the thread. :?

I'm sure, though, that you'll find it in yourself to later stoop to his level and answer his questions, as you did so generously for Lee even after you promised not to help him anymore.

Posted: Tue Feb 05, 2008 12:05 am
by Nodtveidt
Hey McTroll2227, I thought you didn't care about people saying "thank you"? Seems you can't keep your story straight.

Re: Hum de dumb

Posted: Tue Feb 05, 2008 1:06 am
by Seb McClouth
burger2227 wrote:It appears that Sebby has better things to do than reply to our posts.

So I won't bother with that dude no more!

Ted
Hey Teddy

Soz about not replying but I'm extremly busing. I'm working full time.
I'm responsible for a family (that includes a wife and a baby girl). I also have to go to school for the job, one day a week.
The job involves irregulars hours so also irregular sleeping. And the irregular free time that I have I spend in working on QBinux

I did read the post and gave the codes a try.

If I don't reply doesn't mean I don't appreciate the work your guys doing.
Because I do and it helps a lot.

Thx for what your guys did and are doing this far!

Seb

OK Seb

Posted: Tue Feb 05, 2008 5:28 am
by burger2227
Teddy don't bother me sweetheart.......LOL. Thanks for acknowledging, but I see you here a lot and I got a lil pissy because I spent some time posting that. No problemo!

But Nod ought to stick with his crayons and quit messing with adults. Why don't you just stick to the FB forum and perhaps learn something? Make another childish game or something Nod. Your Avitar goes from STFU to "We are family" LOL. Grow up man! You gotta be over 18 by now.....

Yeah BDZ, you were right on that one. Seems when I get pissy here, good ole Nod comes around to pull my BLEEP.

Ted

PS: Are you BLIND NOD? Read the line below for cryin out loud!

Posted: Tue Feb 05, 2008 5:40 am
by Seb McClouth
I understand. Nothing more fustrating then ppl who you do a lot for, never say thx or anything.

Thanks! I'll try your information tomorrow.

Posted: Tue Feb 05, 2008 11:03 am
by Ralph
Seb, once someone answers your post, all you have to do, if you read it, is put in a very short "Thank you" note, stating your intention of answering at a later time or date. This is called "acknowledging". This is the minimum respect one shows for others, and there is really no good excuse for not acknowledging anyone who helps. It's just a matter of self-conviction or of self-trainging, and, it only takes less than a minute to do.

The above is meant only as "an instruction for better living", and is not meant to offend. Hope you understand.

Posted: Tue Feb 05, 2008 1:40 pm
by Seb McClouth
That true. Thx Ralph.

Posted: Tue Feb 05, 2008 2:20 pm
by Nodtveidt
burger2227, go back to sucking face with Pete at qbasic.com. The two of you make a cute couple, or so they say anyways.

AHA

Posted: Tue Feb 05, 2008 2:47 pm
by burger2227
So we got you visiting too! GREAT, welcome aboard. Don't be shy........

Ted

Posted: Tue Feb 05, 2008 3:07 pm
by Seb McClouth
Hey guys

Due to some Linux stuff I was again in need of the binary to bit.
It was for the ~ (complementary stuff).
If you don't know what this is:
e.g. we have 8 in 4 bit => 1000, when doing the ~action, it becomes 0111, because it simple changes 1 to 0 and 0 to 1.

Maybe you already know how to do this but here's the code I came up with. I know it looks very noobish but atleast it seems to work. And the fact that I choose for a certain amount of bugs might not be correct.

Code: Select all

temp1 = 500 'we gonna complementair 500 in this example.

temp$ = ""
temp2 = 0
mirrortemp$ = ""
temp3 = 0
compltemp$ = ""
mirrorcompltemp$ =""
temp4 = 0

FOR a = 0 TO 20  'I'm assuming for the test we only need 20 bits
  If temp1 AND 2^a THEN 'as Ted told me to test, I'm testing here if it goes
      temp$ = "1"+ temp$ 'Why did I assume again this has to be one?
      temp2 = temp2 + (temp1 AND 2 ^ a) 'to test if temp2 = temp1 then
     IF temp2 = temp1 THEN EXIT FOr        'we leave the for-next-thing
ELSE
     temp$ = "0" + temp$
END IF
NEXT

'The above code gives us the bits for temp1

FOR a = 1 to len (temp$)
mirrortemp$ = MID$(temp$, a, 1) + mirrortemp$  'mirror the bit from temp$ for check
NEXT

'from here I'm lost in remarks, but it works.

FOR a = 1 TO LEN(mirrortemp$)
IF MID$(mirrortemp$, a, 1) = "1" THEN
  IF a = 1 THEN
    temp3 = temp3 + 1
  ELSE
    temp3 = temp3 + 2 ^ (a-1)
  END IF
END IF
NEXT

IF temp3 = temp1 THEN 'compare temp3 and temp1
FOR a = 1 TO LEN(temp$)
   IF MID$(temp$, a, 1) = "0" THEN
      compltemp$ = compltemp$ + "1"
   ELSEIF MID$(temp$, a, 1) = "1" THEN
      compltemp$ = compltemp$ + "0"
   END IF
NEXT

FOR A = 1 to LEN(compltemp$)
mirrorcompltemp$ = mid$(compltemp$, a, 1) + mirrorcompltemp$
NEXT

FOR a = 1 to LEN(mirrorcompltemp$)
IF MID$(mirrorcompltemp$, a, 1) = "1" THEN
   IF a = 1 THEN
      temp4 = temp4 + 1
   ELSE
      temp4 = temp4 + 2 ^ (a-1)
   END IF
END 
NEXT
So, is there an easier way? Or should this do the trick.

Posted: Tue Feb 05, 2008 11:56 pm
by Patz QuickBASIC Creations
If you're only dealing with 4 bits, then a simple

Code: Select all

YourValue% XOR 16
should give you what you're looking for. That's saying if you pull out the 4 bits you needed into the YourValue%, that is.

Posted: Wed Feb 06, 2008 12:23 pm
by Seb McClouth
Well I need the code for a value which is calculated with several things I don't know the outcome. So basically I made a calculation (see code under here)

Code: Select all

FOR a = 0 TO 20  'I'm assuming for the test we only need 20 bits 
  If temp1 AND 2^a THEN 'as Ted told me to test, I'm testing here if it goes 
      temp$ = "1"+ temp$ 'Why did I assume again this has to be one? 
      temp2 = temp2 + (temp1 AND 2 ^ a) 'to test if temp2 = temp1 then 
     IF temp2 = temp1 THEN EXIT FOR        'we leave the for-next-thing 
ELSE 
     temp$ = "0" + temp$ 
END IF 
NEXT
simple exits the for-next if the calculated bits are the same as the input. So if we have 500 for example we have 9 bits, 200 for example 8 bits, if I'm not mistaken.

I'm not sure weither I could use XOR for that matter. But I do now understand now 32 bits = 4294967296, etc.

That's for that insight.

But I'll keep your code in mind, might need it for someother thing in QBinux. Thx Patz.

Conversions

Posted: Thu Feb 07, 2008 2:54 pm
by burger2227
Below converts a decimal number to binary. It uses Integer division and mod with the base 2 system of binary:

Code: Select all

SUB Dec2Bin
COLOR 14: LOCATE 2, 30: PRINT "Decimal to Binary"
COLOR 10: LOCATE 5, 20: INPUT "Enter a decimal number: ", num&
DO
remain = num& MOD 2    'remainder is used for binary result
num& = num& \ 2           'discard any remainder with integer division
Bin$ = LTRIM$(STR$(remain)) 'make string number
Binary$ = Bin$ + Binary$    'add remainder to binary number
LOOP UNTIL num& = 0
COLOR 11: LOCATE 10, 30: PRINT "Binary number = "; Binary$  'binary result

END SUB
You can convert decimal values to any other base number system using the base number. The binary result shows which bits are on as 1's.

Ted

Posted: Thu Feb 07, 2008 5:26 pm
by Seb McClouth
Thx Man!!

I'm gonna try the code later. But it looks just like the thing I need!!

Posted: Thu Feb 07, 2008 5:43 pm
by Patz QuickBASIC Creations
Not entirely related, but...

http://www.petesqbsite.com/forum/viewtopic.php?t=1830

Also, a more simple but less universal (than the one in the other post I linked to) code to determine the bits of a number...

Code: Select all

'Inputs: YourNum% - The number to turn into binary.
'Outputs: Bin$ - The number in binary, formatted as a string.

DO
  MaxBit% = MaxBit% + 1
LOOP UNTIL 2 ^ MaxBit% > YourNum%

'Remove the part above and replace the MaxBit% below if you already
'know the highest bit your program will have, or if you can only take
'certain bits (ie, up to 16)

FOR A = 0 TO MaxBit%
  Bin$ = LTRIM$(RTRIM$(STR$(ABS(((2 ^ A) AND YourNum%) > 0)))) + Bin$
NEXT A