Битовые опреации

Автор eeigor, 3 апреля 2022, 16:13

0 Пользователи и 1 гость просматривают эту тему.

eeigor

В LO Basic есть битовые операторы типа (?):

& ( AND )
| ( OR )
^ ( XOR )
~  ( NOT )
<<(сдвиг влево)
>>(сдвиг вправо)

Функции листа:
https://help.libreoffice.org/7.3/en-US/text/scalc/01/04060120.html

Edit:
Есть число 7 (=1+2+4), примеру. Как определить, что установлены 1, 2 и 3 биты (2^0, 2^1, 2^2)? Вот что-то забыл я...
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

 Это вопрос или утверждение? :)
Владимир.

eeigor

#2
Теперь "вопрос"
Если битовых операций нет, то через FunctionAccess, или я делал раньше какой-то простой цикл, не помню...
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

#3
Битовые операции есть: Or, And, Xor.

 Msgbox (6 And 10)

вернет 2.

Соответственно, 3 бит проверяем так:

If (n and 4)>0 Then
Владимир.

eeigor

Откровенно говоря, понял плохо...
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

#5
Посмотрите это и другие сообщения в теме Владимира Захарова (ZVI).
Владимир.

eeigor

#6
Работают оба варианта

Sub Test_BitOperations()
' NOTE: Allowed input value combinations: 1, 2, 3, 4, 5, 6, 7
' 1st option is 1 (= 2 ^ 0)
' 2nd option is 2 (= 2 ^ 1)
' 3rd option is 4 (= 2 ^ 2)
' Combinations: 3 = 1 + 2
'              6 = 1 + 5
'              7 = 1 + 2 + 4
Dim nValue&: nValue = 6  ' <- Set input value here
Dim aOptions&(1 To 3), i%

For i = 1 To 3
aOptions(i) = (nValue Mod 2 ^ i) \ 2 ^ (i - 1)
Next
MsgBox Join(aOptions, Chr(10))

Erase aOptions()
ReDim aOptions&(2)
Dim nNewValue&
For i = 0 To 2
aOptions(i) = Abs(((2 ^ i) And nValue) > 0)
If ((2 ^ i) And nValue) > 0 Then
nNewValue = nNewValue + 2 ^ i
End If
Next
MsgBox Join(aOptions, Chr(10)) & Chr(10) _
& Chr(10) & nNewValue
End Sub

Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community