Language agnostic 基于非函数运算符的整数量级的一条线性

Language agnostic 基于非函数运算符的整数量级的一条线性,language-agnostic,Language Agnostic,我想知道是否有任何方法可以在不使用函数调用和只使用运算符(无控制结构)的情况下获得整数的大小 如果我在这里不正确地使用了“震级”一词,我的意思基本上是占用了多少位数。2468的震级是4 否则,最有效的方法是什么? 我能想到的最好的方法是while(num/=10)mag++计算相关值时有固定的“位黑客”,就像这是类似的,因为你想找到最高的非零的数字。p> 但是,由于您对base-10值感兴趣,并且这些方法使用二进制算法,因此我不确定它们是否可以调整。但是,看看它们是如何工作的,可能会给你一些想法

我想知道是否有任何方法可以在不使用函数调用和只使用运算符(无控制结构)的情况下获得整数的大小

如果我在这里不正确地使用了“震级”一词,我的意思基本上是占用了多少位数。2468的震级是4

否则,最有效的方法是什么? 我能想到的最好的方法是
while(num/=10)mag++
< C语言中的解决方案是首选的(C,C++,爪哇,C等)

< P>计算相关值时有固定的“位黑客”,就像这是类似的,因为你想找到最高的非零的数字。p> 但是,由于您对base-10值感兴趣,并且这些方法使用二进制算法,因此我不确定它们是否可以调整。但是,看看它们是如何工作的,可能会给你一些想法。

计算相关值时有固定时间的“比特黑客”,就像这是类似的,因为你想找到非零的最高数字


但是,由于您对base-10值感兴趣,并且这些方法使用二进制算法,因此我不确定它们是否可以调整。不过,看看它们是如何工作的可能会给你一些想法。

从数学上来说,你想要的⌊log10(| x |)⌋ + 1.除非x是0

运算符和您给出的函数之间的差异是任意的。人们总是可以创建一种具有⌊log10(| x |)⌋ + 1号接线员

尽管如此,我们还是可以从创建一个integeral log10(x)方法开始,这个方法最容易通过简单的比较完成:

//assumes 32-bit int in max value. Add cases accordingly
return (x >= 1000000000) ? 9 : (x >= 100000000) ? 8 : (x >= 10000000) ? 7 : 
  (x >= 1000000) ? 6 : (x >= 100000) ? 5 : (x >= 10000) ? 4 : 
  (x >= 1000) ? 3 : (x >= 100) ? 2 : (x >= 10) ? 1 : 0;
无论得到什么结果,我们都要加1,所以我们甚至不需要加1,我们只需改变结果:

return (x >= 1000000000) ? 10 : (x >= 100000000) ? 9 : (x >= 10000000) ? 8 : 
  (x >= 1000000) ? 7 : (x >= 100000) ? 6 : (x >= 10000) ? 5 : 
  (x >= 1000) ? 4 : (x >= 100) ? 3 : (x >= 10) ? 2 : 1;
另外,这还可以正确处理x==0的情况

现在我们只需要控制它

x = x > 0 ? x : -x;
return (x >= 1000000000) ? 10 : (x >= 100000000) ? 9 : (x >= 10000000) ? 8 : 
  (x >= 1000000) ? 7 : (x >= 100000) ? 6 : (x >= 10000) ? 5 : 
  (x >= 1000) ? 4 : (x >= 100) ? 3 : (x >= 10) ? 2 : 1;
一句话:

return ((x > 0 ? x : -x) >= 1000000000) ? 10 : ((x > 0 ? x : -x) >= 100000000) ? 9 : ((x > 0 ? x : -x) >= 10000000) ? 8 :  ((x > 0 ? x : -x) >= 1000000) ? 7 : ((x > 0 ? x : -x) >= 100000) ? 6 : ((x > 0 ? x : -x) >= 10000) ? 5 : ((x > 0 ? x : -x) >= 1000) ? 4 : ((x > 0 ? x : -x) >= 100) ? 3 : ((x > 0 ? x : -x) >= 10) ? 2 : 1;
问题是您是否考虑<代码>?:<代码>控件结构。它是一个操作符,但它确实进行了分支(并且比是否使用控制结构有更大的实际影响,尽管它仍然是一个需要摆脱的微观选择)

让我们看看,在多行程序中,至少可以实现无分支

无分支abs很容易:

 (x ^ (x >> 31)) - (x >> 31); // assuming 32-bit int, adjust shift accordingly
现在,对于对数,我作弊并查找一些我不记得的无聊的黑客。我只是想从我所能读到的内容中干代码移植这个(因为到目前为止我已经完成了C#,最好还是坚持下去),并将测试和修复我引入的任何bug作为练习:

我们首先找到log2(x)

现在我们可以用它来求以10为底的对数:

int[] PowersOf10 = new int[]
    {1, 10, 100, 1000, 10000, 100000,
     1000000, 10000000, 100000000, 1000000000};

int t = (l + 1) * 1233 >> 12;
return t - (x < PowersOf10[t]);
int[]PowersOf10=新int[]
{1, 10, 100, 1000, 10000, 100000,
1000000, 10000000, 100000000, 1000000000};
int t=(l+1)*1233>>12;
返回t-(x<10[t]);

从数学上来说,你想要⌊log10(| x |)⌋ + 1.除非x是0

运算符和您给出的函数之间的差异是任意的。人们总是可以创建一种具有⌊log10(| x |)⌋ + 1号接线员

尽管如此,我们还是可以从创建一个integeral log10(x)方法开始,这个方法最容易通过简单的比较完成:

//assumes 32-bit int in max value. Add cases accordingly
return (x >= 1000000000) ? 9 : (x >= 100000000) ? 8 : (x >= 10000000) ? 7 : 
  (x >= 1000000) ? 6 : (x >= 100000) ? 5 : (x >= 10000) ? 4 : 
  (x >= 1000) ? 3 : (x >= 100) ? 2 : (x >= 10) ? 1 : 0;
无论得到什么结果,我们都要加1,所以我们甚至不需要加1,我们只需改变结果:

return (x >= 1000000000) ? 10 : (x >= 100000000) ? 9 : (x >= 10000000) ? 8 : 
  (x >= 1000000) ? 7 : (x >= 100000) ? 6 : (x >= 10000) ? 5 : 
  (x >= 1000) ? 4 : (x >= 100) ? 3 : (x >= 10) ? 2 : 1;
另外,这还可以正确处理x==0的情况

现在我们只需要控制它

x = x > 0 ? x : -x;
return (x >= 1000000000) ? 10 : (x >= 100000000) ? 9 : (x >= 10000000) ? 8 : 
  (x >= 1000000) ? 7 : (x >= 100000) ? 6 : (x >= 10000) ? 5 : 
  (x >= 1000) ? 4 : (x >= 100) ? 3 : (x >= 10) ? 2 : 1;
一句话:

return ((x > 0 ? x : -x) >= 1000000000) ? 10 : ((x > 0 ? x : -x) >= 100000000) ? 9 : ((x > 0 ? x : -x) >= 10000000) ? 8 :  ((x > 0 ? x : -x) >= 1000000) ? 7 : ((x > 0 ? x : -x) >= 100000) ? 6 : ((x > 0 ? x : -x) >= 10000) ? 5 : ((x > 0 ? x : -x) >= 1000) ? 4 : ((x > 0 ? x : -x) >= 100) ? 3 : ((x > 0 ? x : -x) >= 10) ? 2 : 1;
问题是您是否考虑<代码>?:<代码>控件结构。它是一个操作符,但它确实进行了分支(并且比是否使用控制结构有更大的实际影响,尽管它仍然是一个需要摆脱的微观选择)

让我们看看,在多行程序中,至少可以实现无分支

无分支abs很容易:

 (x ^ (x >> 31)) - (x >> 31); // assuming 32-bit int, adjust shift accordingly
现在,对于对数,我作弊并查找一些我不记得的无聊的黑客。我只是想从我所能读到的内容中干代码移植这个(因为到目前为止我已经完成了C#,最好还是坚持下去),并将测试和修复我引入的任何bug作为练习:

我们首先找到log2(x)

现在我们可以用它来求以10为底的对数:

int[] PowersOf10 = new int[]
    {1, 10, 100, 1000, 10000, 100000,
     1000000, 10000000, 100000000, 1000000000};

int t = (l + 1) * 1233 >> 12;
return t - (x < PowersOf10[t]);
int[]PowersOf10=新int[]
{1, 10, 100, 1000, 10000, 100000,
1000000, 10000000, 100000000, 1000000000};
int t=(l+1)*1233>>12;
返回t-(x<10[t]);

事实上,我一直在对base-2使用位运算,但这次我需要做一些base-10,所以如果有类似的东西,我会抓狂。事实上,我一直在对base-2使用位运算,但这次我需要做一些base-10,所以如果有类似的东西,我会抓狂。