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.
Bit Operation
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.
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 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
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
Re: Bit Operation
Hi Latexi95,
Thank you very much.
Thank you very much.
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.
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.
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.
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.
-
- 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:
Hope this helps someone.
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