查看"Making a basic algorithm"的修改历史记录。当OP改变问题,使一些有趣的答案失效时,受访者之间有一种明显的失望感。所以,我想,为什么不再问原问题,让这些答案成立。
所以基本上我想找到一种更简单的方法:
if(size == 2) unit /= 2; if(size == 2 || size == 6) unit /= 2; if(size == 2 || size == 6 || size == 10) unit /= 2;
所以基本上它检查大小是否等于2,然后每个新行添加4到最后一次大小检查。
我需要达到256。
我想知道是否有一种简单的方法可以做到这一点。
答案 0 :(得分:9)
这里检查相等的数字的基本标准是size / 4
的余数为2.这可以使用模运算符%
来检测:
size % 4 == 2
然后问题是将unit
除以2的次数。对于上面的例子:
size == 2
,unit /= 8
(匹配所有3个条件); size == 6
,unit /= 4
(匹配后两个条件); size == 10
,unit /= 2
(匹配最后一个条件)。因此数字越小,除以8的次数越多。如果选中的最大size
为10,则unit
除以2 ^ (1 + (10 - size) / 4)
。这可以使用右移运算符简洁地表达:
unit >>= 1 + (10 - size) / 4
或者更一般地说:
unit >>= 1 + (max_number - size) / 4
其中max_number % 4 == 2
。
设置max_number = 254
(问题中指定了256,但表达式中没有指定功能;检查的最后一个数字是254),并注意到我们仅在2 <= size <= 254
时才应用此功能,我们可以将最终答案表达为:
if (size % 4 == 2 && size >= 2 && size <= 254) {
unit >>= 1 + (254 - size) / 4;
}
实际上,这种情况可以更简洁地表达(但无疑更不易读):
if ((size & 0xffffff03) == 2)
如@PaulBoddington所述,需要注意右移的大小:如果单位是int
并且移位的位数大于31,那么unit
应该只是设置为零。