forked from haskell-jp/recipe-collection
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
3スクロールを若干超えてしまってます。 `rotate` は、自分が探したことあるので入れましたが、要らないかもしれません。 分かりやすさのために、コメントアウトで2進数表現した数値を書きました。
- Loading branch information
1 parent
b15024e
commit 45e7e80
Showing
1 changed file
with
139 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
``` |