Skip to content

Commit

Permalink
数値: ビット演算を行う haskell-jp#4
Browse files Browse the repository at this point in the history
3スクロールを若干超えてしまってます。
`rotate` は、自分が探したことあるので入れましたが、要らないかもしれません。
分かりやすさのために、コメントアウトで2進数表現した数値を書きました。
  • Loading branch information
matsubara0507 authored May 4, 2017
1 parent b15024e commit 45e7e80
Showing 1 changed file with 139 additions and 0 deletions.
139 changes: 139 additions & 0 deletions 数値/ビット演算を行う.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,141 @@
ビット演算を行う
================

Haskellでビット演算を行うには [`Data.Bits`](https://hackage.haskell.org/package/base-4.9.1.0/docs/Data-Bits.html) モジュールを使います。

論理積
-----

2つの数値の論理積を求めるには演算子 `(.&.)` を使います。

```haskell
> :module Data.Bits
> 10 .&. 6 -- "01010" .&. "00110"
2
> 15 .&. 6 -- "01111" .&. "00110"
6
```

演算子 `(.&.)` の型は次のようになります。

```haskell
(.&.) :: Bits a => a -> a -> a
```

論理和
-----

2つの数値の論理和を求めるには演算子 `(.|.)` を使います

```haskell
> :module Data.Bits
> 10 .|. 6 -- "01010" .|. "00110"
14
> 15 .|. 6 -- "01111" .|. "00110"
15
```

演算子 `(.|.)` の型は次のようになります。

```haskell
(.|.) :: Bits a => a -> a -> a
```

排他的論理和
-----

2つの数値の排他的論理和を求めるには関数 `xor` を使います

```haskell
> :module Data.Bits
> 10 `xor` 6 -- "01010" `xor` "00110"
12
> 15 `xor` 6 -- "01111" `xor` "00110"
9
```

関数 `xor` の型は次のようになります。

```haskell
xor :: Bits a => a -> a -> a
```

反転 (否定, 相補)
-----

数値のビット反転を求めるには関数 `complement` を使います

```haskell
> :module Data.Bits
> complement 10 -- complement "01010"
-11
> complement (-10) -- complement "11010"
9
```

関数 `complement` の型は次のようになります。

```haskell
complement :: Bits a => a -> a
```

ビットシフト
-----

数値のビットシフトを求めるには関数 `shift` を使います
2引数目に `Int` 型でシフトする回数を指定し正の数を与えると右シフト負の数を与えると左シフトをします
またシフトした分を左シフトは `0` で埋め右シフトは最も左にある数で埋めます(符号拡張をする)

```haskell
> :module Data.Bits
> shift 10 2 -- shift "001010" 2
40
> shift 10 (-2)
2
```

関数 `shift` の型は次のようになります。

```haskell
shift :: Bits a => a -> Int -> a
```

ビット回転
-----

数値のビット回転を求めるには関数 `rotate` を使います
2引数目に `Int` 型で回転する回数を指定し正の数を与えると右回転負の数を与えると左回転をします

```haskell
> :module Data.Bits Data.Int
> rotate (101 :: Int8) 2 -- rotate "01100101" 2
-107
> rotate (101 :: Int8) (-2)
89
```

関数 `rotate` の型は次のようになります。

```haskell
rotate :: Bits a => a -> Int -> a
```

ビットサイズ
-----

数値のビットサイズを求めるには関数 `bitSizeMaybe` を使います
`Intger` 型のような固定長ではない型の値を与えた場合は `Nothing` を返します

```haskell
> :module Data.Bits
> bitSizeMaybe (10 :: Int)
Just 64
> bitSizeMaybe (10 :: Integer)
Nothing
```

関数 `bitSizeMaybe` の型は次のようになります。

```haskell
bitSizeMaybe :: Bits a => a -> Maybe Int
```

0 comments on commit 45e7e80

Please sign in to comment.