stesl писал(а): ↑23 мар 2021, 10:37
Тип Word — это целочисленный беззнаковый тип данных, в два байта. Диапазон 0-65535. Используется везде, где оказывается нужным.
Не путайте Word с UInt (unsigned integer16), он не относится к целочисленным, так как не кодирует числовые значения и не совместим с математическими операциями.
Потому что:
Sergy6661 писал(а): ↑23 мар 2021, 12:54
Вот для упаковки-распаковки битовых переменных и используется в основном.
Но не в основном, а только для этого. Если конечно в конкретном ПЛК не срабатывает неявное преобразование, из-за которого кажется, что Word — это целое число.
Отправлено спустя 21 минуту 7 секунд:
Не, иначе объясню:
Word — это когда ты в 16 бит записал 16 булевых значений, каждый из которых что-то значит в смысле true/false. Например, при управлении сервоприводом или частотником.
Int16, UInt16 — это числа, отдельные биты не представляют интереса (хотя бывают редкие исключения).
Математические операции умеют работать с числами, то есть Add(), Sub(), Mul(), Div() работают с Int16/UInt16, а с Word работает подозрительно, подсвечивает типа «глянь, что за дрянь ты задумал?», но воспринимает как число 0-65535. Извините, правда, зачем вы складываете слово управления частотника с числом -85?
Зато сдвиговые операции и операции со словами типа ANDW(), ORW(), NOT(W), XORW() работают именно со словами и подозрительно с целыми числами.
Это разные типы данных, хотя все они 16 бит.
Do While Alien(0).Text = Alien(1).Text Or Alien(2).Text Or Alien(3).Text Or Alien(4).Text Or Alien(5).Text
rand()
Alien(0).Text = WordBank(Word)
Loop
Rand () выбирает случайное слово внутри массива и присваивает случайное слово переменной Word
1 ответ
Лучший ответ
Вы не можете так сравнивать строки. Вы должны повторно проверять Alien(0).Text
для каждого Or
, иначе он попытается оценить ваши строки как значения Boolean
(True или False).
Вот почему вы получаете ошибку: строка (кроме "True"
или "False"
) не может быть преобразована в Boolean
, потому что, как компилятор узнает, как преобразовать, например "Bear"
в True
или False
?
Кроме того, гораздо лучше использовать OrElse
, поскольку он закорочен, что означает, что если одна проверка будет успешной, она выиграет » Не пытаюсь проверить остальные.
Do While Alien(0).Text = Alien(1).Text OrElse Alien(0).Text = Alien(2).Text OrElse Alien(0).Text = Alien(3).Text OrElse Alien(0).Text = Alien(4).Text OrElse Alien(0).Text = Alien(5).Text
3
Visual Vincent
4 Янв 2018 в 18:01
Meta on asking questions: You really should give some examples of how you tried to solve the problem. Shy of that, at least an example of the result you want such as what «bits» means to you. I tend to think of a collection of Word8
values as bits and so there is operation to be performed.
That said, lets pose and answer a series of related questions.
What are the bit operators in Haskell?
If you want bit level operations, instead of doing arithmetic tricks like x || 2^i
you can use the functions from the Bits class:
Prelude> import Data.Bits
Prelude Data.Bits> :i Bits
class Eq a => Bits a where
(.&.) :: a -> a -> a
(.|.) :: a -> a -> a
xor :: a -> a -> a
complement :: a -> a
shift :: a -> Int -> a
rotate :: a -> Int -> a
zeroBits :: a
bit :: Int -> a
setBit :: a -> Int -> a
clearBit :: a -> Int -> a
complementBit :: a -> Int -> a
testBit :: a -> Int -> Bool
bitSizeMaybe :: a -> Maybe Int
bitSize :: a -> Int
isSigned :: a -> Bool
shiftL :: a -> Int -> a
unsafeShiftL :: a -> Int -> a
shiftR :: a -> Int -> a
unsafeShiftR :: a -> Int -> a
rotateL :: a -> Int -> a
rotateR :: a -> Int -> a
popCount :: a -> Int
And also the FiniteBits
class:
class Bits b => FiniteBits b where
finiteBitSize :: b -> Int
countLeadingZeros :: b -> Int
countTrailingZeros :: b -> Int
How can I convert Word8
to [Bool]
?
This is simply testing each bit in the word, and b
toBits x = [testBit x i | i <- [0.. finiteBitSize x - 1]
How can I convert Word8
to some datatype I called Bit
that I won’t show you?
After your first edit I now think you have data Bit = Zero | One
but am unclear if that’s correct. It seems like homework and the advice given here should suffice to get the rest of the way either way.