2013年11月19日火曜日

開発環境

C実践プログラミング 第3版 (Steve Oualline (著)、 望月 康司 (監訳) (翻訳)、谷口 功 (翻訳)、オライリー・ジャパン)のⅡ部(単純なプログラミング)の11章(ビット演算)、11.8(ビットマップグラフィックス)、11.10(プログラミング実習)、実習11-6をHaskellで解いてみる。

その他参考書籍

実習11-6.

コード(BBEdit)

Sample.hs

{-# OPTIONS -Wall -Werror #-}
import Data.Bits
import Data.Int

main :: IO ()
main = do
    putStrLn "3整数型(8ビット char 符号付き)を入力"
    s <- getLine
    if s == "" then
        return ()
    else do
        putStrLn $ "全てのビットを左端までシフト: " ++
                   (show $ allLeft (read s :: Int8))
        main

allLeft :: Int8 -> Int8
allLeft 0 = 0
allLeft n = shiftR (-128) ((bits n) - 1)

bits :: Int8 -> Int
bits n = foldr (\x acc -> if x .&. n /= 0 then acc + 1 else acc) 0 $
        takeWhile (/=0) $ shiftLProgression (1 :: Int8) 1

shiftLProgression :: (Bits a) => a -> Int -> [a]
shiftLProgression a r = a:(map (`shiftL` r) $ shiftLProgression a r)

入出力結果(Terminal, runghc)

$ runghc Sample.hs
3整数型(8ビット char 符号付き)を入力
170
全てのビットを左端までシフト: -16
3整数型(8ビット char 符号付き)を入力
0
全てのビットを左端までシフト: 0
3整数型(8ビット char 符号付き)を入力
1
全てのビットを左端までシフト: -128
3整数型(8ビット char 符号付き)を入力
2
全てのビットを左端までシフト: -128
3整数型(8ビット char 符号付き)を入力
3
全てのビットを左端までシフト: -64
3整数型(8ビット char 符号付き)を入力
4
全てのビットを左端までシフト: -128
3整数型(8ビット char 符号付き)を入力
5
全てのビットを左端までシフト: -64
3整数型(8ビット char 符号付き)を入力
-1
全てのビットを左端までシフト: -1
3整数型(8ビット char 符号付き)を入力
-2
全てのビットを左端までシフト: -2
3整数型(8ビット char 符号付き)を入力

$

{-# OPTIONS -Wall -Werror #-}を記述してるから、細かく型を指定(:: Double)しないと警告がいっぱい出た。慣れるまでは{-# OPTIONS -Wall -Werror #-}の記述を消さずに細かく型を指定していくことに。

0 コメント:

コメントを投稿