条件分岐なしで絶対値を求める

一応条件分岐なしで絶対値を求めている.まあ,条件分岐が少ないほうが,
パイプライン・ストールが減るから言いという話もあるが,ここまでこだわる人もいないでしょう.
そのまえに関数呼び出しの方が時間がかかるのではとかとか...これはinlineいいけど.


まあ,こだわるんだとしたら,big endian, little endianとか1の補数・2の補数とか
あとは,long のサイズとか考えなきゃいけない...普通考えないけど


ちなみに,t0 と t1は自分のコンパイラとオプションだと同じアセンブラが吐かれてた.
unionとかはよくにCで組み込み系のプログラム書く人はよく使うんじゃないかな.
普通プログラムする場合にビットまで考えてプログラムすることないよな...

#include <iostream>
#include <cstdio>
using namespace std;

typedef union {
  long a;
  struct {
    unsigned long d : 31;
    unsigned char f : 1;
  } BIT;
} Test;

long t0(long a) {
  return a * (1 - ((a >> 31) << 1));
}

long t1(long a) {
  Test t;
  t.a = a;
  return a * (1 - (t.BIT.f << 1));
}

long t2(long a) {
  Test t;
  t.a = a;
  return t.BIT.f + (a ^ (0xffffffff * t.BIT.f));
}

long t3(long a) {
  Test t;
  t.a = a;
  return !t.BIT.f * a - t.BIT.f * a;
}

int main() {
  long a, b;
  Test t;
  while(cin) {
    cin >> hex >> a;
    long b = 0xffffffff - a + 1;
    t.a = a;
    printf("%x(%d) %x(%d) (%d) %d %d %d %d\n",
        a, a, b, b, t.BIT.f, t0(a), t1(a), t2(a), t3(a));
  }

  return 0;
}