Reputation: 140534
See the edit history of "Making a basic algorithm". There was a palpable sense of disappointment amongst the respondents when OP changed the question, invalidating some interesting answers. So, I figure, why not ask the original question again, to allow those answers to stand.
So basically I want to find a easier way to do this:
if(size == 2) unit /= 2; if(size == 2 || size == 6) unit /= 2; if(size == 2 || size == 6 || size == 10) unit /= 2;
So basically it checking if size is equal to 2 and then every new line it add 4 to the last size check.
I need to go up to 256.
I want to know if there a easy way of doing this.
Upvotes: 7
Views: 142
Reputation: 140534
The fundamental criterion on the numbers checked for equality here is that the remained of size / 4
is 2. This can be detected using the modulo operator, %
:
size % 4 == 2
Then there is the question of how many times to divide unit
by 2. For the examples above:
size == 2
, unit /= 8
(matches all 3 conditions);size == 6
, unit /= 4
(matches second 2 conditions);size == 10
, unit /= 2
(matches last condition).So the smaller the number, the more times it is divided by 8. If the maximum size
checked is 10, unit
is divided by 2 ^ (1 + (10 - size) / 4)
. This can be expressed concisely using the right-shift operator:
unit >>= 1 + (10 - size) / 4
or, more generally:
unit >>= 1 + (max_number - size) / 4
where max_number % 4 == 2
.
Setting max_number = 254
(256 is specified in the question, but wouldn't feature in the expression; the last number checked would be 254), and noting that we only apply this if 2 <= size <= 254
, we can express the final answer as:
if (size % 4 == 2 && size >= 2 && size <= 254) {
unit >>= 1 + (254 - size) / 4;
}
Actually, the condition can be expressed more concisely (but undoubtedly less readably) as:
if ((size & 0xffffff03) == 2)
As noted by @PaulBoddington, care needs to be taken with the size of the right shift: if unit is an int
and the number of bits shifted is greater than 31, then unit
should simply be set to zero.
Upvotes: 9