Forum: Compiler & IDEs copy_sign() für int?


von Stefan S. (Gast)


Lesenswert?

Nicht dass es jetzt wirklich wichtig wäre, aber ich frage mich gerade, 
wie man für int die Funktion copy_sign() schreibt. Also jetzt eher auf 
dem PC. If soll man ja wohl eher vermeiden, wegen Branch Prediction oder 
so. Also eher die zweite Form? Für Float gibt es copy_sign ja 
vordefinert.
1
#include <stdlib.h>
2
int copy_sign(int a, int b)
3
{
4
  //return (b < 0 ? -abs(a) : abs(a));
5
  return abs(a) * (b/b);
6
}

von Sven B. (scummos)


Lesenswert?

b/b ist immer 1 ...

von Stefan S. (Gast)


Lesenswert?

Da hast Du wohl recht, ich wollte eigentlich schreiben
1
#include <stdlib.h>
2
int copy_sign(int a, int b)
3
{
4
  //return (b < 0 ? -abs(a) : abs(a));
5
  return abs(a) * (abs(b)/b);
6
}

von Sven B. (scummos)


Lesenswert?

Im Zweifel: kompilieren und schauen was schneller ist ;)
Ich kann mir vorstellen dass ziemlich genau derselbe Code rauskommt.

von mh (Gast)


Lesenswert?

Man könnte ja auch das Vorzeichenbit ausmaskieren und kopieren... 
Vorusgesetzt, das INT_MAX Makro ist korrekt gesetzt.
1
return ((a & INT_MAX) | (b & (INT_MAX + 1)))

von Jay (Gast)


Lesenswert?

Ich bin ein bisschen Faul, sonst hätte ich mir aus den BitHacks was 
Wildes zusammenkopiert

http://graphics.stanford.edu/~seander/bithacks.html#CopyIntegerSign

Daher statt dessen:
1
int copy_sign(int v, int s)
2
{
3
  int candidates[] = { v, -v, -v, v };
4
5
  return candidates[((s < 0) << 1) & (v < 0)];
6
}

von Jay (Gast)


Lesenswert?

Jay schrieb:
> int copy_sign(int v, int s)
> {
>   int candidates[] = { v, -v, -v, v };
>
>   return candidates[((s < 0) << 1) & (v < 0)];
> }

Ehm:
1
int copy_sign(int v, int s)
2
{
3
  int candidates[] = { v, -v, -v, v };
4
5
  return candidates[((s < 0) << 1) | (v < 0)];
6
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.