How can I work with binary numbers?
Hi,
I'm trying to manage the collision layer and collision mask, but, I notice that they are binary numbers.
So, I think, I need a variable that increases its value in power of 2, for example 1, 2, 4, 8, 16, 32 and so on, and beside,that can has a limit, for example, 1, 2, 4, 1, 2, 4, 1, 2, 4 etc.
I know Godot can work with hexadecimal numbers but I don't found some example of binary numbers.
How can I make what I want to do? Or what is the right way to make this?
Tags :
Best Answers

rjoshua Posts: 37
Finally, I found a answer. We can deal with binary numbers as if they were string, with these functions:
func _ready(): var b = "1111011" var i = bin2dec(b) print(i) # 123 # Takes in a decimal value (int) and returns the binary value (int) func dec2bin(var decimal_value): var binary_string = "" var temp var count = 31 # Checking up to 32 bits while(count >= 0): temp = decimal_value >> count if(temp & 1): binary_string = binary_string + "1" else: binary_string = binary_string + "0" count = 1 return int(binary_string) # Takes in a binary value (int) and returns the decimal value (int) func bin2dec(var binary_value): var decimal_value = 0 var count = 0 var temp while(binary_value != 0): temp = binary_value % 10 binary_value /= 10 decimal_value += temp * pow(2, count) count += 1 return decimal_value
This code was made by IVAN SKODJE, he explain it in his blog: ivanskodje.com/2016/10/11/55/

rjoshua Posts: 37
@GerHarm I will explain it:
phisicsobjects such as kinematicBody, rigidBody and staticBody have a property called collision_layer and collision_mask, and their values are binary.What I wanted to do was change the value of these variables in order, something like decimal numbers: 1, then 2, 3, 4, 5. But since they are binary, in decimal their value would be 1, 2, 4, 8, 16 etc.
However when I read your question, I remember the binary operators. I have completely forgotten them! but rather as I saw that gdscript had not incorporated binary numbers, maybe I assumed that binary operator did not exist.
The point is that I found a way (thanks to you) to do what I wanted to do, assign the value of these variables as if they were decimals:
extends KinematicBody2D func _ready(): set_layer(4) print(self.collision_layer) # print 8 set_layer(5) print(self.collision_layer) # print 16 func set_layer(n): self.collision_layer = 1 << (n1)
Thank you!
Answers
Finally, I found a answer. We can deal with binary numbers as if they were string, with these functions:
This code was made by IVAN SKODJE, he explain it in his blog: ivanskodje.com/2016/10/11/55/
This looks like prime feature request material, I imagine such a helper function should be builtin to GDScript
I don't understand the question, i think.
What exactly are you trying to do? what's wrong with using the bitwise operators like everybody else? or is this just for printout?
@GerHarm I will explain it:
phisicsobjects such as kinematicBody, rigidBody and staticBody have a property called collision_layer and collision_mask, and their values are binary.
What I wanted to do was change the value of these variables in order, something like decimal numbers: 1, then 2, 3, 4, 5. But since they are binary, in decimal their value would be 1, 2, 4, 8, 16 etc.
However when I read your question, I remember the binary operators. I have completely forgotten them! but rather as I saw that gdscript had not incorporated binary numbers, maybe I assumed that binary operator did not exist.
The point is that I found a way (thanks to you) to do what I wanted to do, assign the value of these variables as if they were decimals:
Thank you!
That's what i was thinking. Btw i just checked the API and the base class KinematicBody2D already has methods for this:
bool get_collision_layer_bit ( int bit ) const
bool get_collision_mask_bit ( int bit ) const
void set_collision_layer_bit ( int bit, bool value )
void set_collision_mask_bit ( int bit, bool value )
Cheers,