BInary numbers
-
@d-healey Here you go
inline function decimalToBinary(dec) { local temp = dec; local buffer = []; local isOdd; // Main conversion loop while (temp > 0) { isOdd = temp % 2; temp = isOdd ? (temp-1)/2 : temp/2; buffer.push(isOdd); } // Reverse & stringify local result = "0b"; for (i=buffer.length-1;i>=0;i--) result += buffer[i]; return result; } Console.print(trace(decimalToBinary(5596)));
-
@ustk Thanks, but I need the result as a binary number that I can perform bitwise operations on.
-
@d-healey Oh! In this case, I'm afraid you're asking for too much
The type has to be created in Hise then... -
@d-healey But it should be possible to fake binary operations with arrays, and even convert back to decimal if ever you need, if computation time isn't critical...
-
@ustk said in BInary numbers:
@d-healey But it should be possible to fake binary operations with arrays, and even convert back to decimal if ever you need, if computation time isn't critical...
That's how I'm currently doing it, but that's no fun :)
-
-
but I need the result as a binary number that I can perform bitwise operations on.
There is nothing like a "binary number", just "binary representation of a number". You can perform bitwise operations on ordinary numbers:
125 & 15 == 125 % 16
If your human brain needs to view the numbers as binary, use the method @ustk to convert it to a string. You might need the reverse function to parse a binary representation string to a number, that should be a fun little exercise.
-
@christoph-hart Yep this works nicely
const mask = 1 << 3; Console.print(((12 & 10) & mask) != false); // 1
-
As a little test here's a snippet that uses a bit mask to figure out which combination of 4 buttons are turned on.
I'll probably make an explanation video about this at some point but if you want a simple guide to this stuff I recommend this.
HiseSnippet 1115.3ocsV81aaTCF2WZuwti+HlDuFYtWftPJYIskAh0pUZZKJh0t.oTgzzzjycNMV0w9jsutEAUhOJ7sguF7AfWv2.3w9tjbsMqzFFQIW7y++4e12icOkLgp0RExK33IYTj2642ehvLpyHBSf5tmUwPF2PUGS0FztSxHZMME44sx2Z8vKXUj6ye8jcIbhHgNWEBchjkPeJaLyLWauc9NFme.IkdLabEu2bmtIRQGIWlCnYE+VnLRxYjSoGQrtUyG4cu8SYFopugXnZvmckoS5OR9JQg+mvzrAbpUnMpOjnB0nNiX7zdSmoZDxa0dym2qTLu+H+CYorY5mO++PmA77HpxAd0tIH09N.IuJPZ0BH8.+9IJVlYtEKddW+tBX4XHAn5pPovWTseeE+NRvCgo4XxYzCTfvrHheTqVqggG0ebXnhdJVjOFFADu1fGjaLv.713m+BP4PoBGy.oVOFyvag2D9qQi5g+bXPomMyx0ihmVsSolNxwYRAHDGsqykHbCaNZfaWuNTxoA9b1KZpstKLJIuCgyG.q0wRQg8R8P.WDFxDblfhGlKRLLo.eEmhSlVy0vmS34TG.gokC3gAgAWcdLE7bp3TynxIUfKjFaiyHJME3q3CIlQMyjuJd80vr53OCWA6vT8DashqWfwG9P7.i36yopIS4xRQnrKlel5PDjgoieCbRo04rxh3jK6zhYE1PbboT.HFvkIDN1tf63KfgvOAGcjb1NAhhhM4JAMEJQyH7Wiih.NEH0aKqZKiqtw1R7o3313s1B3y53OYa7PBWawRoaN+zVCQQNsAAZ6RRDlHRwPgCmq5ZaufGQXldNbc.M3hvhevWfZzRNsYlhAK.Z61wKBunBGdjzPelH1QUvpJ9plFNbg1JobNUsPy1tbpaJPKyLfpptPYcDZCb4dK2610aIoX6VEGkhtBl4YYzR4Cj7TaOC63q2IBUte01lrDgfqFWGoOnriTA6iXPRB7KDZibvu5ABn6P3qe0vKAxsL7M9uE9lKH7er6dDCw1YtjP.RJipLL6Zg2dzygi1J5SG3uGUelQlg77m8FNL9VvYut54eSlI7qjcnBBr3ZO54oThRX6vitSIe8JI+OReKm7Mpj7eS+VN4aVE4+xcJ42+Ml7P+osHsY226Og7MwN3i8PHC80Pvuieg8ETCl9P4XnBDvrmWMM4b3LhdJJzv1Agqe3MbsAYZNmXt7cIrWZpz.zD3RGfaOjVnYlIUeG5NbAiV23ELtsP7A98XljQKFi0V.Fg2P9+.ikWK6882e3PZhYN.W0+feZYuC1+R4+AYtgINEN4WwraRNJebe31nITn5BAkqs6WpYasTH2xJaYf9TQpS3ugOkFaak8JM1dpQzXRhR9xjhdS1K9cemF.SB28bC7OzJim0O02uUyVnwvtwWljXm9eNz0dwwr9RDyFKQLatDw7EKQLOZIh4KWhX9paLFaifuI2HGW75.nn29tiF77120ovsKD8Oz0KehB
-
@d-healey It is indeed interesting programmatically, but isn't that a bit convoluted for such a simple task?
Or do you intend to use it something else, maybe? -
@ustk said in BInary numbers:
but isn't that a bit convoluted for such a simple task?
Do you have a method that uses less lines of code to display every possible combination of x number of active buttons?
@ustk said in BInary numbers:
do you intend to use it something else,
I'm using to filter a list. Each button is a different attribute that can be filtered.
-
@d-healey Well, as for just displaying, yes it can be much simpler but I know you already know what I will show you below, so if you do it your way, I'm sure there is a good reason behind it, like for filtering your list
HiseSnippet 1065.3ocsV0uaaaCDmxNZqx6CzBrG.B+OSFNy0Nwsa.YCKKNICFqI0aNKX.EEEzRzwDghTijJqFaAnOJ6QqOB6MX6n9vlI0oHwK0vvV22+zc7tiiTxHpVKUHufSlmRQdep+34ByrAyHLAZ39VFSYbCUcBUaP6MOkn0zXjmW8ezpgWvFn7O+y2uGgSDQzkrPnSkrH5yXILyRti18mXb9gjX5IrDGs6u6vHoXfjKy.zT2uKJkDcN4L5wDqZ07QdezAwLiTM1PLTMxai8jwyGOS9GhB8OkoYS3TKQOzXvQErOTxisH1xEMXFiGOp5sVi.uLZYNndQN3K7OhEyVveYt3g4BvKsvMe3U6pvq9UfWOW300Adq.RdNPZiBH8H+wQJVpYoDKd9D+gBnzLk.ocWnTnKp1Cq6OPBZHLcRHmSOTADKrH7oc6tIF9o0NMZ.odsAOIyXfGveG9EuDXNUpvgLfp6NXF9aw8g+Z2tUi+rQPolcRyzyBqhwYTy.YRpT.DgM2KWkl31VezF2qUKHPUF9B1K6nspKLJIe.gym.U6PonPdIevfKaz3wOFOwH94LpZdENKIAns5XWoPSvCUOeCwqT5xH1fI3LAEOMSDYXRA9cTJLpJRahufvyn4oD1TbXIU.PFvkQDNdBfwlM2ACuDlYLMNRlwiwSnXh.STJxbrVhYluTioDMipvFINkplQR03hFOl3LLAyYZSmNc.+BeudgopZvohyLyJqRAA4PxIgC4nSs.LrUtzfI31.3bqSs60B9uIF.pISInwvK+l3l6TDV30WK4zNQbJQEZqlKXkBvzDNwx6xFW5j5NVZnOWDlmgfhI95hlNckxJyzbpZkhsiNTuOCCEYISnJ25iUQne5pMo92bSp6LjnhSYNJJECELyySohaZxBp7nocFSIp.UM4syedY6bQtGwft1.+BhdnbH6NYEcGLeqqadIPtklu8+Oy6uBv+qC2mXH1wZkIDHIAmvMLa92ae5EvNhhgbA96S0majoPcYQyL77sHm8Z2EIyWP7FxtTAAJn141OCN0JriGQ2Imukiyea78ry21w4+s9d148cQ9ecmb9CtQm2vuZZni2eShi2e6uuqg9ZvIeregdqHVL8QxDHRDPrmWMM4B5PwHEElQmCk2cCHr6UFmwIlqtP1dKjRAv.fqrEztoSnYl4tGGu21Reag3i7GwLQyVMFqsBLBcJeHvX4ca9L+ClNkFYVBvM7O729vbQFzuHyLv5qiHFECNr3ebVxX35cQTH5BAkaG.6UyNhoftqk1lAFSEw4D+K7oTXOKsWovdUBQIjHk7UQEynr2d5A4b.LIxu3Xf+QVZ7h4p99c6zEk.mFeUTj80+qfo2q1lsVCa1dMro+ZXySVCad5ZXyWuF17MuWarCB9gLiLonc.XL5f7UDddGjOoH+TH5+.OiUWF
-
@ustk said in BInary numbers:
I'm sure there is a good reason behind it, like for filtering your list
I'm not always so sure, sometimes I see a path and follow it, but it's not always the right one :)
In this case I want to use a switch statement. So if button 1 is on, do something, and if button 2 is on do that as well, etc. I figure I can run a switch on a single value more easily than multiple if statements over an array, but I might be wrong.
-
@d-healey So if I understand well, you need a single number representation of the state of all buttons at a time?
In this case, effectively this is the best solution I can see... -
@d-healey You can also switch over an array, it has the advantage of giving easy readable code, but it might not be compatible with what you want to achieve...
inline function onbtnQueryControl(component, value) { if (value) { local state = []; for (i = 0; i < buttons.length; i++) state.push(buttons[i].getValue()); Console.clear(); switch (state) { case [0,0,0,1]: Console.print("Do this"); break; case [0,0,1,0]: Console.print("Do that"); break; case [1,0,1,1]: Console.print("Do whatever"); break; default: Console.print("Do nothing"); } } }
-
@ustk Oh I didn't know that! For 4 buttons I think that's more readable, when you get up to 10+ buttons I think it might become unpleasant.
-
@ustk that works? I didn‘t knew you can use array literals as switch cases.
But if this comes in the vicinity of a realtime callback I wouldn‘t trust it not allocating so a bit fiddling might be better suited.
-
@d-healey Note that it can also be replaced by the string representation of the same binary number.
I'm not sure to agree with the fact that it can become unpleasant, because it's always easier to debug or maintain a visual representation rather than a state you don't "see", but it's a matter of taste of course... -
@christoph-hart Yep that works! I understand the allocation issue though... This is where using a string would be better
-
inline function onbtnQueryControl(component, value) { if (value) { local state = ""; for (i = 0; i < buttons.length; i++) state += Math.round(buttons[i].getValue()); Console.clear(); switch (state) { case "0001": Console.print("Do this"); break; case "0010": Console.print("Do that"); break; case "1011": Console.print("Do whatever"); break; default: Console.print("Do nothing"); } } }