## Bit Operation

Post your coding questions such as 'how to' here.
peter
Active Member
Posts: 123
Joined: Mon Oct 22, 2007 2:31 pm

### Bit Operation

Hi,

does anyone know something about BIT OPERATION in CoolBasic?
I need an "Bit AND" and an "Bit OR". No logical operators!

for example: value = 12423936
farb = (value shr 16) BIT AND 255

if you are interested, I want to write this function for my library:

Function GetColorR(sys_col) :red component of a color.
Return sys_Col & 0xFF
End Function

Function GetColorG(sys_Col) :green component of a color.
Return (sys_Col >> 8) & 0xFF
End Function

Function GetColorB(sys_Col) : blue component of a color.
Return (sys_Col >> 16) & 0xFF
End Function

thank you for the help.

Latexi95
Guru
Posts: 1164
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

### Re: Bit Operation

Bitwise operations are very slow because CB doesn't support them natively and you have to do logical operations for each bit separately. I'm not sure if these work but at least they should.

Code: Select all

``````Function BinXor(l1,l2)
l3 = 0
For i = 0 To 31
l3 = l3 + (((l1 Shl (31-i) Shr 31) Xor ((l2 Shl (31-i)) Shr 31)) Shl i)
Next i
Return l3
EndFunction

Function BinAnd(l1,l2)
l3 = 0
For i = 0 To 31
l3 = l3 + (((l1 Shl (31-i) Shr 31) And ((l2 Shl (31-i)) Shr 31)) Shl i)
Next i
Return l3
EndFunction

Function BinOr(l1,l2)
l3 = 0
For i = 0 To 31
l3 = l3 + (((l1 Shl (31-i) Shr 31) Or ((l2 Shl (31-i)) Shr 31)) Shl i)
Next i
Return l3
EndFunction``````
But there is a better way to implement those functions which you need. You can use binary shifts to remove unwanted bits. It's much faster.

Code: Select all

``````Function GetColorR(sys_col) //RED component of a color.
Return (sys_Col Shl 8) Shr 24
End Function

Function GetColorG(sys_Col) //GREEN component of a color.
Return (sys_Col Shl 16) Shr 24
End Function

Function GetColorB(sys_Col) // blue component of a color.
Return (sys_Col Shl 24) Shr 24
End Function
``````

peter
Active Member
Posts: 123
Joined: Mon Oct 22, 2007 2:31 pm

### Re: Bit Operation

Hi Latexi95,

Thank you very much.

peter
Active Member
Posts: 123
Joined: Mon Oct 22, 2007 2:31 pm

### Re: Bit Operation

Hi Latexi95,

yes, it works fine. But something is wrong.

Red must be SHL 24.
Blue must be SHL 8.

I am really silly, I have to open eyes in the future.
I had Bit Operation in my mind, found not this solution!

Anyway, thank you.

Latexi95
Guru
Posts: 1164
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

### Re: Bit Operation

Pixel value has this kind of layout:
00000000 RRRRRRRR GGGGGGGG BBBBBBBB

If I want to get red color component I first move bits 8 steps to left (SHL 8):
RRRRRRRR GGGGGGGG BBBBBBBB 00000000
And then I move bits 24 steps to right (SHR 24):
00000000 00000000 00000000 RRRRRRRR
And here we have red color component.

koodaaja
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

### Re: Bit Operation

If you want to do it in your original way, 'x&0xFF' is equal to 'x Mod 256' and 'Shr' is obviously equal to '>>'. CB uses negative values for colors, though, so you'll have to add 256 if the end result is negative.

Misthema
Advanced Member
Posts: 312
Joined: Mon Aug 27, 2007 8:32 pm
Location: Turku, Finland
Contact:

### Re: Bit Operation

I know this is a bit old topic...but:

Code: Select all

``````_alpha = 255
_red = 255
_green = 0
_blue = 127

// Negative integer with alpha value (CB doesn't support alpha-channels, so it's kunda useless anyway)
color1 = _alpha Shl 24 + _red Shl 16 + _green Shl 8 + _blue

// Positive integer without alpha value
color2 = _red Shl 16 + _green Shl 8 + _blue

// Both colors works the same

Text 10,60, "color1 = "+color1
Text 10,75, "color2 = "+color2

Color 0,0,color1
Box 10,10,20,20

Color 0,0,color2
Box 40,40,20,20

DrawScreen
WaitKey

// An example how to get color-components out from an integer (integer consists from four[4] bytes)
_alpha = color1 Shr 24 // _alpha = 255
_red = (color1 Shl 8) Shr 24
_green = (color1 Shl 16) Shr 24
_blue = (color1 Shl 24) Shr 24

Print "Color1: "+_alpha+", "+_red+", "+_green+", "+_blue

_alpha = color2 Shr 24 // _alpha = 0, since there isn't alpha value in color2
_red = (color2 Shl 8) Shr 24
_green = (color2 Shl 16) Shr 24
_blue = (color2 Shl 24) Shr 24

Print "Color2: "+_alpha+", "+_red+", "+_green+", "+_blue

WaitKey``````
Hope this helps someone.