API > Bit


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

このページではBit APIについて解説する。

参考資料:
執筆時のバージョン:
  • ComputerCraft 1.58 for Minecraft 1.6.4




Bit API

数値のビット操作に関するAPI。
Lua自体はビット演算子を持たないが、このAPIを利用すればビットフラグなども簡単に操作することができる。

数値を2進数32bitの整数としてビット操作する。小数を含む数値や、32bit(4,294,967,295)を超える数値を指定するとエラーとなる。
数値は32bit符号なし整数(0~4,294,967,295)として扱われる(例:-1 → 4294967295)。

【1.42-】CC1.41以前のLuaによる実装からJava側での実装に変更され、bit.tobits関数とbit.tonumb関数が削除された。

【1.42-】dan200.computer.core.apis.BitAPI で定義
【-1.41】lua\rom\apis\bit で定義

bnot

  • bit.bnot(n)
  • n(数値)のビット単位の論理否定(NOT)を求める
  • 戻り値:数値型

2進数での各桁の値と結果は以下の通り
0 → 1
1 → 0

例:
print( bit.bnot( 18 ) )
18(2進数:10010)のビット単位NOTを求め、結果を表示する。
4294967277(2進数:11111111111111111111111111101101)が表示される。

band

  • bit.band(m, n)
  • m(数値)とn(数値)のビット単位の論理積(AND)を求める
  • 戻り値:数値型

2進数での各桁の値と結果は以下の通り
0, 0 → 0
1, 0 → 0
0, 1 → 0
1, 1 → 1

例:
print( bit.band( 18, 3 ) )
18(2進数:10010)と3(2進数:00011)のビット単位ANDを求め、結果を表示する。
2 (2進数:00010)が表示される。

bor

  • bit.bor(m, n)
  • m(数値)とn(数値)のビット単位の論理和(OR)を求める
  • 戻り値:数値型

2進数での各桁の値と結果は以下の通り
0, 0 → 0
1, 0 → 1
0, 1 → 1
1, 1 → 1

例:
print( bit.bor( 18, 3 ) )
18(2進数:10010)と3(2進数:00011)のビット単位ORを求め、結果を表示する。
19(2進数:10011)が表示される。

bxor

  • bit.bxor(m, n)
  • m(数値)とn(数値)のビット単位の排他的論理和(XOR)を求める
  • 戻り値:数値型

2進数での各桁の値と結果は以下の通り
0, 0 → 0
1, 0 → 1
0, 1 → 1
1, 1 → 0

例:
print( bit.bxor( 18, 3 ) )
18(2進数:10010)と3(2進数:00011)のビット単位XORを求め、結果を表示する。
17(2進数:10001)が表示される。

blshift

  • bit.blshift(n, bits)
  • n(数値)を左へbits(数値)ビットだけシフトする
  • 戻り値:数値型

n * 2 ^bits に等しい。

例:
print( bit.blshift( 18, 2 ) )
18(2進数:10010)を左に2ビットシフトし、結果を表示する。
72(2進数:1001000)が表示される。

brshift

  • bit.brshift(n, bits)
  • n(数値)を右へbits(数値)ビットだけ算術シフトする
  • 戻り値:数値型

例:
print( bit.brshift( 73, 2 ) )
73(2進数:1001001)を右に2ビット算術シフトし、結果を表示する。
18(2進数:10010)が表示される。

算術シフトなので最上位ビットが1の場合、ビットシフトで空いた上位ビットは1で埋められる(0の場合は0で埋められる)。

例:
print( bit.brshift( 2147483648, 2 ) )
2147483648(2進数:10000000000000000000000000000000)を右に2ビット算術シフトし、結果を表示する。
3758096384(2進数:11100000000000000000000000000000)が表示される。

blogic_rshift

  • bit.blogic_rshift(n, bits)
  • n(数値)を2進数で右へbits(数値)桁だけ論理シフトする
  • 戻り値:数値型

例:
print( bit.brshift( 73, 2 ) )
73(2進数:1001001)を右に2ビット論理シフトし、結果を表示する。
18(2進数:10010)が表示される。

論理シフトなので最上位ビットの値に関わらず、ビットシフトで空いた上位ビットは0で埋められる。
n / 2 ^bits で余りを捨てた値に等しい。

例:
print( bit.brshift( 2147483648, 2 ) )
2147483648(2進数:10000000000000000000000000000000)を右に2ビット論理シフトし、結果を表示する。
536870912 (2進数:00100000000000000000000000000000)が表示される。

tobits

【-1.41】
  • bit.tobits(n)
  • n(数値)をビットごとに分解しテーブルにして返す
  • 戻り値:テーブル型。キーは桁の番号(1が最下位)、値は各桁の値(数値型、0か1)

【1.42】この関数は削除された。

例:
for k, v in pairs( bit.tobits( 18 ) ) do
  print( k, ", ", v)
end
18(2進数:10010)をビット単位で分解したテーブルを取得し、その各キーと値を表示する。
以下の様に表示される。
1, 0
2, 1
3, 0
4, 0
5, 1

tonumb

【-1.41】
  • bit.tonumb(bit_tbl)
  • ビットごとに分解された値を表すテーブルbit_tbl(テーブル)から、それが表す値を返す
  • 戻り値:数値型

【1.42】この関数は削除された。

bit_tblのキーは桁の番号(1が最下位)、値は各桁の値(数値型、0か1)

例:
t = {}
t[1] = 0
t[2] = 1
t[3] = 0
t[4] = 0
t[5] = 1
print( bit.tonumb( t ) )
2進数10010(10進数:18)を表すテーブルを数値へ変換し、それを表示する。
18が表示される。