Writing bits

Blitz3D Forums/Blitz3D Programming/Writing bits

ringwraith(Posted 2008) [#1]
Is there any way to write bits to a file in Blitz? So, if you were just storing a true or false value, for example, and you didn't want to take up a whole 8 bits would it be possible to just store it as one bit in a file?


_33(Posted 2008) [#2]
Storage works in bytes, so really if you want to handle at the bit level, you have to separate your writes into bunches of 8 bits.


Ross C(Posted 2008) [#3]
Why not dedicate a byte of storage to say 8 bits? I mean, if you have for instance other instances when a bit needs to be stored, group them all together, in groups of 8.


ringwraith(Posted 2008) [#4]
Ok, so if I wanted to store bits, then I would have to combine them into bunches of 8 bits which would make 1 byte that could be stored. But then how would I read that byte and be able to take from it the individual value of each bit? Maybe this is a stupid question, but I only half understand how the whole bit-byte system works so please excuse my ignorance.


Snarkbait(Posted 2008) [#5]
Function GetBit(value,position)
	Return (value Shr (position - 1)) And 1
End Function 


value is the byte, position is 8 to 1, left to right


Snarkbait(Posted 2008) [#6]
and PutBit()

Function PutBit(value, position, bit = True)
	Return value Or (bit Shl (position - 1))
End Function 


here's a test

a = 128
Print Right$(Bin$(a),8)

Print GetBit(a,7)

a = PutBit(a,4)
Print a
Print Right$(Bin$(a),8)

WaitKey
End 


voila, you can now put up to 8 booleans into one byte.

(there's actually another way to do this, like the way bitflags are done for file attributes, don't feel like getting into it.)


jfk EO-11110(Posted 2008) [#7]
While these GetBit and PutBIt Functions are well done, I have to say he probably will understand nothing of it, esp. cause of SHR.

I suggest to read some quick tutorials about BOOLEAN algebra.

When you know each bit has a binary value (1,2,4,8,16,32 etc.) you can test a bit this way (eg. for the bit number 4, that represents a value of 8):

my_byte=rand(0,255)

is_set=(my_byte AND 8)
if is_set=8 then print "Bit 4 is set"

Now to set a bit you will use the OR command

my_byte=my_byte OR 8


and finally to clear a bit you'll use AND NOT()

my_byte=my_byte AND ~(8)

(BTW Snarkbait PutBit lacks of this...if bit=0 then unset etc)

So these are the underlying basics of something rather sophisticated like "Return (value Shr (position - 1)) And 1"

EDIT: the Boolen command NOT doesn't seem to work as desired, instead use the operator "~" that does the same job.


Snarkbait(Posted 2008) [#8]
Well, yeah I realized the put bit didn't work to clear a bit...

How bout this:

Function GetBit(value,position)
	Return (value Shr (position - 1)) And 1
End Function 

Function SetBit(value, position)
	Return value Or (1 Shl (position - 1))
End Function 

Function UnSetBit(value, position)
	Return value And ~(1 Shl (position - 1)) 
End Function 

Function ToggleBit(value,position)
	Return (1 Shl (position - 1)) Xor value
End Function 


He doesn't have to understand the bitwise math to use them as black box functions ;)


jfk EO-11110(Posted 2008) [#9]
Ok, but you still can't clear it, can you?

I'd suggest to
Function SetBit(value, position, bit=1)
	If bit<>0
		Return value Or (1 Shl (position - 1))
	Endif
	Return value And ~(1 Shl (position - 1))
End Function 


Edit uh, you've edited yours :) so now it'S complete.

BTW - even I don't know (or forgot) about the "~" operator o_O. Truely black box technology.


Snarkbait(Posted 2008) [#10]
Yep ;)

and blitzplus at least won't let me use 'and not' you have to use the bitwise complement ~


jfk EO-11110(Posted 2008) [#11]
Oops - right now it seems I can't get NOT to work at all!!! But I am absolutely sure it worked before! Probably somehthing new in version 1.99??

~ works, NOT no longer!

a=Not(8)
print a

will give zero!

Can't believe this...


jfk EO-11110(Posted 2008) [#12]
Wow. I just tested it back to Blitz3D Version 1.91... No way. It never worked. I apologize for all my "supercompetent help".

Well, simply replace the NOT by a ~
(So I'll edit my code)

You know what is really strange: I used NOT in a program to control a CNC Mill, and the program worked...weird...spooky.


ringwraith(Posted 2008) [#13]
Wow, thanks for all the replies everyone. I think I semi-understand what's going on but I'm going to check out some tutorials like jfk suggested. Those functions look really useful too, just hope I can figure out the mechanics behind them.


Ross C(Posted 2008) [#14]
Well, the simplest i think i can put it, is a byte is as follows:

00000000

8 bits of data stored together

Now, simply speaking each bit has a value, and when turned to 1, starting from the right, their values are:

1,2,4,8,16,32,64,128

Using combinations of these bits, you can make any number between 0 and 255. The computer stores these as voltages. Above a certain voltage means that a 1 is stored. Below a certain voltage, a 0 is stored.

When you use AND NOT OR... etc you are basically filtering the data against other data. If you read a byte of data and it contained the number:

168

That would break down to:

128+32+8

or

10101000

128   64   32   16    8    4    2    1
---------------------------------------
 1     0    1    0    1    0    0    0


(used a code box to keep the formatting)
I hope this helps a little and adds to what the other guys have been saying.


Neochrome(Posted 2008) [#15]
what about

a=1
b=0

if a and (NOT b)
; this actually works
end if


ringwraith(Posted 2008) [#16]
Oh thanks Ross, that explanation really makes sense. I just had one of those 'aha' moments!