给定一个整数x,如何返回一个小于或等于x的整数y和64的倍数?将一个整数舍入到最接近的整数,它小于或等于它并且是64的倍数
回答
只需使用的(64-1)位反转and
它:
x = x & ~63
// 64 is 000...0001000000
// 63 is 000...0000111111
// ~63 is 111...1111000000
这基本上清除了较低的六个位,这与将其舍入到64的倍数相同。请注意,这将对负数趋向负无穷大,而不是朝向零,但这似乎是您的问题需要的内容。
你可以在这里看到的行为在这多重的四个变种:
#include <stdio.h>
int main (void) {
int i;
for (i = -10; i <= 10; i++) {
printf ("%3d -> %3d\n", i, i & ~3);
}
return 0;
}
这将产生:
-10 -> -12
-9 -> -12
-8 -> -8
-7 -> -8
-6 -> -8
-5 -> -8
-4 -> -4
-3 -> -4
-2 -> -4
-1 -> -4
0 -> 0
1 -> 0
2 -> 0
3 -> 0
4 -> 4
5 -> 4
6 -> 4
7 -> 4
8 -> 8
9 -> 8
10 -> 8
请记住,这只是作品的两个大国(像2 = 64)和二进制补码(ISO标准没有强制要求 - 请参阅here了解详情 - 但我已经从来没有看到一个不使用它的C环境,我从事最恶劣的8051系统到最大的大型机)。如果你想使用除数的任何其他数字,你应该使用适当的数学函数,如floor
。
哪里x
是要向下舍到n
最接近倍数的数字,你需要的方法是:
floor(x/n) * n
,你可以用C实现真的很好++(相对于C):
int n = 5;
for (int x = 0; x < 100; x++)
cout << x << " -> " << (x/n) * n << endl;
int y = x;
while (y % 64)
y--;
假设你需要最近这样的整数,并且您与正数工作:
x = x/64 * 64;
各种各样的黑客入侵查看,但在这种特定情况下绝对不需要它们。
除了每次最少显示比最快的部分快。编译器通常会在合理的情况下优化2个MULT DIV的功率(对于2的低功率)。 – jcolebrand 2010-05-05 04:11:42
@drachenstern:不,只有当精确的意图无法通过语言表达时,点击才会更快。在这种特殊情况下,任何优秀的编译器都应该生成最高效的代码,如果它碰巧是一个“有点破解”,那么编译器应该使用它,而不是源代码的作者。不,mul/div不一定是优化的 - 这是一个古老的都市传说。他们通常被优化成适合每种情况的最有效的操作,这可能是一个转变或其他事情。事实上,这些日子很少有转变。 – AnT 2010-05-05 05:12:50
最后,通过在源代码层面上使用一些小技巧,实际上可以减少发生高效优化的机会。换句话说,对于这样的直截了当的案例来说,黑客攻击通常会显得较慢,而不是像你似乎错误地相信的那样快。 – AnT 2010-05-05 05:13:58
(x >> 6) << 6
先右移6位,然后左下位填充零点。
带符号没有问题
编辑:我想大多数编译器将优化x/64 * 64
(和任何分/用2小国乘),以相同的代码,所以在这样的位魔法不实际需要,直到你希望你的代码看起来真的很酷:)
(和AndreyT认为有是简单的代码,甚至更好的优化,阅读评论他post)
这实际上非常该死的光滑,你必须经常在C适当工作,是吧? – jcolebrand 2010-05-05 03:49:09
@drachenstern:PL/SQL,其实:)只是梦想C或C++的工作 – 2010-05-05 03:53:50
哈哈,嗯,whatashame。猜猜这是值得的实践吧? – jcolebrand 2010-05-05 04:13:20
- 1. 将整数舍入到10的最接近倍数
- 2. 计算一个值并舍入到最接近的整数
- 3. 将等于一个整数总是等于一个整数吗?
- 4. 将浮点数舍入到ruby中最接近的整数
- 5. 向上舍入一个双精度到最接近的整数
- 6. 将数字舍入到最接近的5或10的倍数,取决于最先的数字
- 7. jQuery将十进制数转换为整数并检查它是大于还是小于另一个整数
- 8. 在Java中将双精度舍入到最接近的整数?
- 9. 在SQL UPDATE中将值舍入到最接近的整数
- 10. 将我的小数点浮点数舍入到最接近的一半或整数?
- 11. 在python中将正数/负数舍入到最接近的“整数”数
- 12. 将数字凑整到5的最接近倍数
- 13. 我试图停止PHP函数,它接受我的表单输入值并舍入到最近的整数
- 14. 如何将一个整数舍入到Pascal中最接近的1000?
- 15. 舍入整数的倍数为50
- 16. jQuery的四舍五入到最接近的整数
- 17. 的javascript - 如何四舍五入到最接近的整数
- 18. 四舍五入到最接近的整数变量
- 19. 在VBA中舍入到最接近的较大整数
- 20. 舍入到最接近的指定整数集合
- 21. MATLAB被四舍五入到最接近的整数
- 22. Powershell - 向下舍入到最接近的整数
- 23. 将整数舍入到大整数
- 24. 四舍五入到C的1/16的最接近倍数
- 25. JavaScript取整到最接近的整数
- 26. 舍入到最接近的倍数与JS
- 27. 将Postgre中的列中的数字舍入为最接近的整数
- 28. 程序检查整数是否大于,小于或等于
- 29. 将小数舍入到最接近的0.05?
- 30. 编写代码,将双“a”的结果舍入到最接近的整数“b”
嘿,这个工作在签名ints? – Plynx 2010-05-05 02:09:46
伟大的黑客............. – aviraldg 2010-05-05 02:13:34
感谢您的指定 - 虽然爱这个答案! – Plynx 2010-05-05 02:15:44