- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 for 循环查找给定数字的反对数。
int g = 0, m, diff = 10;
for(j = 0; g <= diff; j++)
{
g = pow(2, j);
}
m = j - 2;
cout << m;
它给出 2 的幂,其中 g
是刚好小于 diff
的数。
我尝试了对数的基数变化定理来找到像这样的数字的反对数:
m = log(diff) / log(2);
没有 for 循环,但在这种情况下,只要有一个数字是 2 的倍数(例如 8),它就会给出 2 作为答案,而不是 3。
并且在程序中使用 for 循环这样做超出了时间限制。
是否有更短且可靠的方法来做到这一点?
最佳答案
这是一个没有循环的有趣解决方案:
function antilog(int input) {
int pow2 = input - 1;
pow2 |= pow2 >> 16; // turn on all bits < MSB
pow2 |= pow2 >> 8;
pow2 |= pow2 >> 4;
pow2 |= pow2 >> 2;
pow2 |= pow2 >> 1;
pow2++; // get least pow2 >= input
return // construct binary offset of pow2 bit
((pow2 & 0xffff0000) != 0) << 4
| ((pow2 & 0xff00ff00) != 0) << 3
| ((pow2 & 0xf0f0f0f0) != 0) << 2
| ((pow2 & 0xcccccccc) != 0) << 1
| ((pow2 & 0xaaaaaaaa) != 0);
}
后半部分改编自bit twiddling hacks的部分内容. (了解来源,可能有一些其他功能比执行您所要求的更快。
除了解决方案,应该注意的是,导致您的解决方案缓慢的原因是重复调用 pow
。 ,这是一个相对昂贵的功能。因为您正在进行整数运算(而且乘以 2
,这是每台计算机最喜欢的数字),所以将您的循环编写如下更有效:
int g=1,m,diff=10;
for(j = 0; g <= diff && g <<= 1; j++) /* empty */;
m=j-2;
cout<<m;
这真是太棒了。 int g=1
将 g 初始化为它在代码第一次执行您编写的循环体时所采用的值。循环条件 g <= diff && g <<= 1
评估为 g <= diff
. (请注意,如果 diff >= 1 << (8 * sizeof(int) - 2)
是一个问题,我们可以将两个的最大幂存储在一个 int 中)。空语句只是让我们有一个格式良好的 for 语句,编译器(大部分)不会提示。
关于c++ - 如何找到数字的反对数(以 2 为底)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51814566/
我有一些按钮总是 float 在浏览器窗口的底 Angular 。 后退 按钮位于正确的位置,但下一步 按钮不会正确 float 。 #footerback { width: 107px;
有谁知道如何在传统 java 中使用此公式计算三角形的面积而不更改或添加公式中的任何内容? 面积 = 1/2*底*高 如果我像这样修改公式: 面积=1.0f/2*baseheigh 或 1/2.0fb
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关于您编写的代码问题的问题必须在问题本身中描述具体问题 — 并且包括有效代码 以重现它。参见 SS
我正在使用 jQuery mobile 并有一个 div,我只希望底部的 2 个 Angular 具有 flex 的外观。 根据我的阅读,我明白我应该使用: ui-corner-bl 和 ui-cor
我是一名优秀的程序员,十分优秀!