haskell - 二进制表示的 Data.Bits 操作

标签 haskell bitwise-operators

我想对二进制数据使用 Data.Bits 位运算符。 我需要使用什么数据类型? 我编写了这个函数,例如:

ch :: Int8 -> Int8 -> Int8 -> Int8
ch x y z = (x .&. y) `xor` ((complement x) .|. z)

我想获取输入二进制类型或至少 String (不是 Int),但仍使用 Data.Bits

那么我需要改变什么才能像这样使用它呢? : ch 11111111 101110011 10110101

最佳答案

如所写,ch 将仅采用 Int8 值,但您可以放宽函数的类型而不更改其实现:

import Data.Bits

ch :: Bits a => a -> a -> a -> a
ch x y z = (x .&. y) `xor` (complement x .|. z)

二进制值只是整数的特定表示,但为了使内容更具可读性,您可以启用BinaryLiterals,例如在 GHCi 中就像这样:

*Q48065001> :set -XBinaryLiterals
*Q48065001> ch 0b11111111 0b101110011 0b10110101
-58

在代码文件中,您可以使用语言编译指示启用它:

{-# LANGUAGE BinaryLiterals #-}

如果您有二进制数字的字符串表示形式,您首先需要解析它们。参见例如Convert a string representing a binary number to a base 10 string haskell

关于haskell - 二进制表示的 Data.Bits 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48065001/

相关文章:

arrays - IOArray 和 STArray 的奇怪分析开销

parsing - Monadic 解析函数珍珠 - 将多个解析器粘合在一起

haskell - 数字参数化向量的 Monad 实例?

c - 右移按位运算中出现意外输出

C++ - 对浮点值中的位进行操作

c - 为什么这里优先使用位运算和乘法而不是条件?

haskell - "illegal type synonym family"的解释

javascript - PHP 与 JavaScript,按位运算符

c++ - C++如何对负数进行按位 "or"运算?

haskell - 在 Haskell 中获取列表最后一个元素的最快方法