相关疑难解决方法(0)

C/C++中是否有标准符号函数(signum,sgn)?

我想要一个函数,对于负数返回-1,对于正数返回+1. http://en.wikipedia.org/wiki/Sign_function 写我自己很容易,但似乎应该在某个标准库中.

编辑:具体来说,我正在寻找一个工作浮动的功能.

c c++ math

387
推荐指数
11
解决办法
34万
查看次数

n是负数,正数还是零?返回1,2或4

我正在构建一个PowerPC解释器,它运行得很好.在Power架构中,条件寄存器CR0(x86上的EFLAGS)几乎在任何指令上都会更新.它是这样设置的.如果最后一个结果为负,则CR0的值为1,如果最后结果为正,则为2,否则为4.

我的第一个天真的解释方法是:

if (n < 0)
    cr0 = 1
else if (n > 0)
    cr0 = 2;
else
    cr0 = 4;
Run Code Online (Sandbox Code Playgroud)

但是我知道所有这些分支都不是最佳的,每秒运行数百万次.我已经看到了一些有点黑客攻击,但似乎没有任何东西.例如,我发现许多例子将数字转换为-1,0或1,相应地符号为0.但是如何使-1 = 1,1 = 2 = 0?我要求Bit Hackers的帮助......

提前致谢

更新: 首先:谢谢你们,你们一直很棒.我会仔细测试你的所有代码以获得速度,你将成为第一个知道谁是胜利者的代码.

@jalf:关于你的第一个建议,我实际上并没有在每条指令上计算CR0.我宁愿保留一个lastResult变量,当(和如果)以下指令要求标志时,进行比较.三个主要动机让我回到"每次"更新:

  1. 在PPC上,您不必像在x86上那样更新CR0(其中ADD总是更改EFLAGS,即使不需要),您有两种ADD,一种更新.如果编译器选择使用更新版本,则意味着它将在某个时刻使用CR0,因此没有必要延迟...
  2. 有一个特别痛苦的指令叫做mtcrf,它可以让你随意改变CR0.你甚至可以把它设置为7,没有算术意义......这只会破坏保留"lastResult"变量的可能性.

c++ bit-manipulation bit-shift bit

35
推荐指数
3
解决办法
1967
查看次数

没有逻辑运算符的舍入整数除法

我想要一个功能

int rounded_division(const int a, const int b) { 
    return round(1.0 * a/b); 
}
Run Code Online (Sandbox Code Playgroud)

所以我们有,例如,

rounded_division(3, 2) // = 2
rounded_division(2, 2) // = 1
rounded_division(1, 2) // = 1
rounded_division(0, 2) // = 0
rounded_division(-1, 2) // = -1
rounded_division(-2, 2) // = -1
rounded_division(-3, -2) // = 2
Run Code Online (Sandbox Code Playgroud)

或者在代码中,其中ab是32位有符号整数:

int rounded_division(const int a, const int b) {
    return ((a < 0) ^ (b < 0)) ? ((a - b / 2) / b) : …
Run Code Online (Sandbox Code Playgroud)

c c++ rounding

4
推荐指数
1
解决办法
667
查看次数

对于仅包含数学的整数,获得1,0,-1为正,零或负

我有一种情况,我正在对大量行进行计算,如果我可以避开条件语句,我可以真正提高性能.

我需要的是给定的正,零或负整数我想分别得到结果1,0,-1.

所以,如果我这样做col/ABS(col),我将获得1为正数,-1为负数,但当然如果col等于0,那么我将得到一个错误.我不能得到错误.

这看起来很简单,但我无法绕过它.

algorithm

1
推荐指数
1
解决办法
105
查看次数

标签 统计

c++ ×3

c ×2

algorithm ×1

bit ×1

bit-manipulation ×1

bit-shift ×1

math ×1

rounding ×1