I have converted several online Classic cipher tools from Java Script, Python, C, and C++ to VB.Net for some of my projects.
I will at times create small projects to get a better understanding of how a certain function works given different input.
In this project I needed to understand how the Java Script “>>>” Right shift zero fill worked for a function I’m trying to convert.
If the number input was “Positive” then it was just a normal right shift operation that should be found in just about any programming language.
If the number was “Negative” then it starts getting more complicated.
If we look at the simple example they have there.
In my test program we see.
We start by converting the negative number to a positive.
Get the binary bits for the number
Flip the bits , what was a “1” is now a “0” and what was a “0” is now a “1”.
Next we trim the right side 2 bits for the shift amount of 2. That only leave us with 2 bits left.
If we convert that back to a Integer then we end up with “1”.
As we’ve seen above in the borrowed example and my test program the expected result is not “1” but “1073741821”. So what else do we have to do ?
Well, this function is based on 32 “Bits” , so.
We subtract the shift amount from 32 and get 30.
Since there are 2 bits left we subtract 2 from 30 and get 28
Next we pad the left side of the remaining bits with 28 “1’s” .
Finally we convert the binary string back to Integer or Long.
The amount of bits to fill is, (32- Shift Amount) – remaining bits or in this case
(32-2 = 30) –2 bits left = 28.
Now what if we want to shift more than 4 which is the the number of bits for “9”,
“1001” for the Positive value and “0110” for the Flipped bit version.
Then we pad the left side with bits equal to the amount left needed to equal the shift length. For instance we start with 4 bits and want to shift 5 then we pad 1 bit to the left.
Now when we get done shifting there are no bits left . Or we could just say if the shift amount is greater than the available bits then the remaining bits is “0”.
As we see the math above, in this case it would be (32 –5 = 27) – 0 since there are no bits left.
So we end up with 27 “1’s” , “111111111111111111111111111” , convert back to Integer or Long and end up with 134217727 which is the result we were expecting.
I randomly chose those numbers to give a wider variety and lengths to work with.
After testing every number and shift on the list, my program agreed with the results shown above.
The bottom set is the last set I was testing once I started asking myself what happens when the shift is greater than the bits available.
In conclusion, the name of this function is a little misleading. When I fist started testing I was trying to “Zero Fill” the left side, taking it literally. That was not working.
After several try’s and building the test data is became clear on how it worked.
I hope this saves someone else several days of testing.