std.intrinsic
コンパイラ組み込みの関数です。Intrinsic の関数はコンパイラ組み込みの関数です。 外部関数で扱うには非効率な、 特定のCPU機能の恩恵を受けるためのものです。 コンパイラの最適化ルーチンとコード生成器は intrinsic 関数と完全に連携して、 その力を十分に活用します。 結果、驚くほどのスピードアップに結びつくことがあります。
License:
Public Domain
Authors:
Walter Bright
- int bsf(size_t v);
- v の bit 0 から始めて、
最初に立っているbitを探します。
Returns:
最初に立っているビット番号。 vが0の場合の結果は未定義です。
- int bsr(size_t v);
- v の最上位ビットから始めて、
最初に立っている
bit を探します。
Returns:
最初に立っているビット番号。 vが0の場合の結果は未定義です。
Example:
import std.stdio; import std.intrinsic; int main() { uint v; int x; v = 0x21; x = bsf(v); writefln("bsf(x%x) = %d", v, x); x = bsr(v); writefln("bsr(x%x) = %d", v, x); return 0; }
Output:
bsf(x21) = 0
bsr(x21) = 5
- int bt(uint* p, size_t bitnum);
- ビット判定
- int btc(uint* p, size_t bitnum);
- ビットを判定してから反転
- int btr(uint* p, size_t bitnum);
- ビット判定してから、そのビットを0にする
- int bts(uint* p, size_t bitnum);
- ビット判定してからそのビットを1にセット(Test and Set)
Params:
uint* p uint の配列を指す NULL でないポインタ index ビット番号で、p[0] の bit 0 から始まって増加していく番号です。 言い方を変えると、次のビットに対応します。。 p[index / (uint.sizeof*8)] & (1 << (index & ((uint.sizeof*8) - 1)))
Returns:
ビットが立っていたら非0、 いなければ0を返します。
Example:
import std.stdio; import std.intrinsic; int main() { size_t array[2]; array[0] = 2; array[1] = 0x100; writefln("btc(array, 35) = %d", <b>btc</b>(array, 35)); writefln("array = [0]:x%x, [1]:x%x", array[0], array[1]); writefln("btc(array, 35) = %d", <b>btc</b>(array, 35)); writefln("array = [0]:x%x, [1]:x%x", array[0], array[1]); writefln("bts(array, 35) = %d", <b>bts</b>(array, 35)); writefln("array = [0]:x%x, [1]:x%x", array[0], array[1]); writefln("btr(array, 35) = %d", <b>btr</b>(array, 35)); writefln("array = [0]:x%x, [1]:x%x", array[0], array[1]); writefln("bt(array, 1) = %d", <b>bt</b>(array, 1)); writefln("array = [0]:x%x, [1]:x%x", array[0], array[1]); return 0; }
Output:
btc(array, 35) = 0 array = [0]:x2, [1]:x108 btc(array, 35) = -1 array = [0]:x2, [1]:x100 bts(array, 35) = 0 array = [0]:x2, [1]:x108 btr(array, 35) = -1 array = [0]:x2, [1]:x100 bt(array, 1) = -1 array = [0]:x2, [1]:x100
- uint bswap(uint v);
- 4バイトのuint型中の各バイトを、前と後ろで交換します。つまり
byte0 は byte3 になり、byte1 は byte2 になり、
byte2 は byte1 になり、byte3 は byte0 になります。
- ubyte inp(uint port_address);
ushort inpw(uint port_address);
uint inpl(uint port_address); - I/Oポート port_address を読みとります。
- ubyte outp(uint port_address, ubyte value);
ushort outpw(uint port_address, ushort value);
uint outpl(uint port_address, uint value); - I/Oポート port_address へ value を書き込みその値を返します。