A single bit can represent 0 or 1 ( or true/ false). You might want to do Boolean operations between two or more such bits. The operations would be negation, or, and and xor. For instance,
if power_on and room_cold then call PowerUpAnother possibility is toggling an output off/on.
power =not( power)
outPort =outPort or 4... would be used to force bit two ( of the eight from 0 to 7) high. ( 4 is '00000100' in binary.)
outPort =outPort and 251... would force the same bit low. ( 251 is '11111011' in binary.)
There are several other useful operations, usually referred to in electronics as 'shift registers'. The bits in the byte can be shifted left or right, losing a bit at one end and feeding in a zero at the other. Alternatively they can be rotated either way- here, the bit 'falling off' one end is fed back in at the other end. You can also feedback in the negated overflow bit.
There is also the interesting possibility of other feedback ring-counters. Especially interesting is the maximal-length switch-tail ring-counter, where XOR-ing an appropriate pair of bits can create a pseudo-random sequence.
Booleans are a bit problematic in LB. There is no boolean type, nor any boolean logic operators in LB. The IF-statement treats any non-zero value as true. Comparison operators evaluate to 1 (true) or 0 (false). Some other functions use -1 for true (such as the not() function). AND, OR and XOR are bitwise operators. An example of how you can get bitten if you disregard this and think that you can really use any value for True, and that bitwise operators are really logical operators: False = 0 True = 2 a = 1 b = 1 if a = b and True then print "True and True is True" else print "AND fails on two true values" end if if (a = b) xor True then print "...and we fail with XOR" else print "True xor True is False" end ifThe difference between logical and bitwise AND:
The operands of logical and are boolean values (1 logical_and 2 = true and true = true), the operands of bitwise and are numeric values (1 bitwise_and 2 = 0). LB has only the latter kind of AND.
mainwin 80 30 nomainwin UpperLeftX = 10 UpperLeftY = 10 WindowWidth = 400 WindowHeight = 400 graphicbox #w.gb1, 50, 30, 300, 40 graphicbox #w.gb2,150, 90, 200,200 textbox #w.tb1, 150,300, 200, 20 button #w.b1, "Ring-L", [ring], LR, 310, 200, 70, 30 button #w.b2, "Seed", [seed], LR, 310, 250, 70, 30 button #w.b3, "L-shift", [lshift], LR, 310, 150, 70, 30 button #w.b4, "R-shift", [rshift], LR, 310, 100, 70, 30 button #w.b5, "Pattern", [pattern],LR, 310, 50, 70, 30 open "Bitwise Demos" for window as #w #w, "trapclose [quit]" #w.gb1, "down" #w.gb1, "fill black ; flush" #w.gb1 "backcolor darkgray" for i =1 to 8 #w.gb1 "up ; goto "; 34 *i -5; " 20" #w.gb1 "down ; circlefilled 15" next i #w.gb1 "flush" #w.gb2, "down" #w.gb2, "fill black ; flush" #w.gb2 "backcolor darkgray" for i =1 to 8 theta =i /8 *2 *3.14159265 xx =50 *cos( theta) yy =50 *sin( theta) #w.gb2 "up ; goto "; 100 +xx; " "; 100 +yy #w.gb2 "down ; circlefilled 15" next i #w.gb1 "flush" v =int( 256 *rnd( 1)) #w.tb1 v; " Edit to any integer 0--255" print dec2Bin$( v, 8) wait [pattern] #w.tb1 "!contents? v" print dec2Bin$( v, 8) wait [ring] for i =1 to 16 print dec2Bin$( v, 8) v =rotLeft( v) #w.gb1 "getbmp scr 0 0 300 40" bmpsave "scr", "scr"; i; ".bmp" unloadbmp "scr" ' ImageMagick- 'convert -delay 100 -loop 0 scr*.bmp anim.gif' timer 1000, [on] wait [on] timer 0 next i wait [seed] v =int( 256 *rnd( 1)) #w.tb1 v print dec2Bin$( v, 8) wait function dec2Bin$( num, b) ' returns a string, length 16 ' leading spaces then the binary rep'n in b bits. while ( num >0) dec2Bin$ =str$( num mod 2) +dec2Bin$ num =int( num /2) wend 'l =len( dec2Bin$) dec2Bin$ =right$( "00000000" +dec2Bin$, b) dec2Bin$ =right$( space$( 16) +dec2Bin$, 16) for i =9 to 16 if mid$( dec2Bin$, i, 1) ="1" then #w.gb1 "backcolor red" #w.gb2 "backcolor red" else #w.gb1 "backcolor darkgray" #w.gb2 "backcolor darkgray" end if #w.gb1 "up ; goto "; 34 *( i -8) -5; " 20" #w.gb1 "down ; circlefilled 15" theta =( i -8) /8 *2 *3.14159265 xx =50 *cos( theta) yy =50 *sin( theta) #w.gb2 "up ; goto "; 100 +xx; " "; 100 +yy #w.gb2 "down ; circlefilled 15" next i end function [lshift] for i =1 to 8 print dec2Bin$( v, 8) v =shiftLeft( v) timer 1000, [on2] wait [on2] timer 0 next i wait [rshift] for i =1 to 8 print dec2Bin$( v, 8) v =shiftRight( v) timer 1000, [on3] wait [on3] timer 0 next i wait [quit] close #w end function shiftLeft( bitsValue) shiftLeft =bitsValue *2 end function function shiftRight( bitsValue) shiftRight = int( bitsValue / 2) end function function shiftByteLeft( bitsValue) shiftByteLeft = 255 and ( bitsValue *2) end function function rotLeft( x) rotLeft =( (x +x) mod 256) or (x >127) end function function rotRight( x) rotRight =( 128 *( x and 1)) or int( x /2) end function function inv$( x) ' 8-bit bit inversion j$ =right$( dec2Bin$( x, 8), 8) k$ ="" for j =1 to 8 if mid$( j$, j, 1) ="1" then l$ =l$ +"0" else l$ =l$ +"1" next j inv$ =right$( l$, 8) end function
'nomainwin UpperLeftX = 10 UpperLeftY = 10 WindowWidth = 630 WindowHeight = 290 graphicbox #w.gb1, 10, 55, 560, 40 button #w.b1, "Faster", [speed], LR, 350, 80, 100, 30 button #w.b7, "Halt!", [halt], LR, 350, 40, 100, 30 button #w.b2, "Start from here", [PatChange], LR, 460, 80, 100, 30 button #w.b3, "Change start pattern", [seed], LR, 240, 80, 200, 30 button #w.b6, "S-tail", [stail], LR, 570,100, 100, 20 button #w.b5, "Ring", [ring], LR, 570, 70, 100, 20 button #w.b4, "Shift", [shift], LR, 570, 40, 100, 20 button #w.b8, "XOR", [xor1], LR, 570, 10, 100, 20 statictext #w.st1, "", 75,110, 510, 24 statictext #w.st2, "<--------------< shifting towards left <--------------------------<", 75, 20, 510, 24 statictext #w.st3, "You can enter a number, or say '1+4+16' or '2^22'."; chr$( 13);_ "It will display above in binary.", 360, 190, 140, 50 'textbox #w.tb1, 456, 157, 60, 30 graphicbox #w.gb2, 572, 71, 10, 10 del =1000 opt$ ="shift" tick =1 global v open "Recycle your bits!" for window as #w #w, "trapclose [quit]" #w.gb1, "down" #w.gb2 "down ; goto 4 4 ; down ; backcolor red ; color red ; fill black" #w.gb1 "fill darkgray ; flush" #w.gb1 "backcolor darkgray" #w.st1 "!font arial 14" #w.st2 "!font arial 14" '#w.tb1 "!font arial 14" for i =1 to 50 #w.gb1 "up ; goto "; 10 *i +50; " 20" #w.gb1 "down ; circlefilled 6" next i #w.gb1 "flush" v = 1 'print v '#w.tb1 v dummy$ =dec2Bin$( v) wait [shift] opt$ ="shift" #w.st1 "" wait [ring] opt$ ="ring" #w.st1 ">--------------> re-circulating from left >-------------------------->" wait [stail] opt$ ="stail" #w.st1, ">--------------> re-circulating from left but inverted ----------->" wait [xor1] opt$ ="xor" #w.st1, ">--------------> re-circulating from left b50 XOR b47 ----------->" wait [halt] tick =0 wait [seed] response$ = "C:" prompt "Enter an integer seed 0 -- 2^49"; v$ v =int( eval( v$)) if v >2^49 then v =2^49 print dec2Bin$( v) [PatChange] '#w.b2, "Start" #w.b2 "!disable" del =1000 '#w.tb1 v #w.b1 "Faster" t =0 tick =1 while tick =1 #w.gb2 "backcolor green ; circlefilled 7" print dec2Bin$( v) #w.gb1 "getbmp scr 0 10 560 20" 'bmpsave "scr", "scr"; right$( "00000" +str$( t), 5); ".bmp" 'these will be merged into an animation with ImageMagick t =t +1 unloadbmp "scr" timer del, [on0] wait [on0] timer 0 select case opt$ case "shift" v =lshift( v) case "ring" v =lrot( v) case "stail" v =stail( v) case "xor" v =fxor( v) end select #w.gb2 "backcolor black ; circlefilled 7" timer del, [on] wait [on] timer 0 wend #w.b2 "!enable" wait [speed] if del =1000 then del =50 #w.b1 "Slower" else del =1000 #w.b1 "Faster" end if if v =1 then del =1000 wait function dec2Bin$( num) while ( num >0) dec2Bin$ =str$( num mod 2) +dec2Bin$ num =int( num /2) wend dec2Bin$ =right$( "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +dec2Bin$, 50) for i =1 to 50 if mid$( dec2Bin$, i, 1) ="1" then #w.gb1 "backcolor red" else #w.gb1 "backcolor darkgray" end if #w.gb1 "up ; goto "; 10 *i +50; " 20" #w.gb1 "down ; circlefilled 4" next i end function [quit] close #w end function lrot( x) lrot =( (x +x) mod 2^50) or (x >=2^49) end function function lshift( x) lshift =( x +x) mod 2^50 end function function stail( x) stail =( ( x +x) mod 2^50) or ( (x >=2^49) =0) end function function fxor( x) vv =x Bin$ ="" while ( vv >0) Bin$ =str$( vv mod 2) +Bin$ vv =int( vv /2) wend Bin$ =right$( "0000000000000000000000000000000000000000000000000000" +Bin$, 50) 'print Bin$ b1 =val( mid$( Bin$, 1, 1)) if b1 <>0 then b1 =1 else b1 =0 b2 =val( mid$( Bin$, 4, 1)) if b2 <>0 then b2 =1 else b2 =0 carry =b1 xor b2 if carry <>0 then carry =1 else carry =0 'print b1, b2, carry fxor =( (x +x) mod 2^50) or carry end function