Форум: "Прочее";
Текущий архив: 2015.03.08;
Скачать: [xml.tar.bz2];
ВнизБитовая логика Найти похожие ветки
← →
AngryOwl (2014-07-25 17:38) [0]Есть Integer-параметр функции. Нужно как-то записать в него четыре значения, используя битовую логику. Помогите разобраться.
function DoSomething(Parameter: Integer): Boolean;
есть четыре значения:
1-е: 0 или 1
2-е: 0 или 1
3-е: 1..4
4-е: 0..65535
← →
antonn © (2014-07-25 17:48) [1]DoSomething(1)
DoSomething(1)
DoSomething(4)
DoSomething(65535)
или я не так понял?
← →
AngryOwl (2014-07-25 17:55) [2]нужно записать в биты Integer-числа 4 других значения
← →
Inovet © (2014-07-25 18:11) [3]> [0] AngryOwl (25.07.14 17:38)
> есть четыре значения:
Это 1048576 значений. Чувствуешь разницу и направление?
← →
AngryOwl (2014-07-25 18:17) [4]разобрался уже:
procedure TForm1.Button1Click(Sender: TObject);
var
N, I, S, D, V: Integer;
NB, IB: Boolean;
begin
N := 1;
S := 2;
D := 65535;
I := 1;
// encode
V := D + (S shl 16) + (I shl 24) + (N shl 25);
ShowMessage(IntToStr(V));
// decode
D := V and $FFFF;
S := (V shr 16) and $0F;
IB := V and (1 shl 24) <> 0;
NB := V and (1 shl 25) <> 0;
ShowMessage(
"N " + BoolToStr(NB) + #13#10 +
"S " + IntToStr(S) + #13#10 +
"D " + IntToStr(D) + #13#10 +
"I " + BoolToStr(IB));
end;
← →
Andryk © (2014-07-25 18:24) [5]Для установки флагов надо использовать операцию XOR и маску например (1111)
и естественно сдвиги вправо или влево
надо установить четыре бита с 16 по 19
маска
(1111)
XOR
(1010)
-------
(1010)
SHL 15
(1010 0000 0000 0000 0000)
Как-то так :)
← →
AngryOwl (2014-07-25 18:45) [6]
> Andryk ©
> надо использовать операцию XOR
Так а что не так в моем варианте, который я выше привел? Проверил - вроде работает.
← →
Andryk © (2014-07-25 18:48) [7]Да все так. Просто я его не увидел пока ответ писал :)
← →
Dimka Maslov © (2014-07-25 18:52) [8]
> Для установки флагов надо использовать операцию XOR
Вообще-то OR всегда была для установки, AND - для проверки, NAND для очистки.
← →
Andryk © (2014-07-25 18:59) [9]Ну в принципе можно и OR особой разницы нет
← →
Inovet © (2014-07-25 19:01) [10]Начнём писать 1-е в младшие разряды и т.д. Будет по позициям
44443321
С учётом значений 3-е: 1..4
Запись
v := n1 or (n2 shl 1) or ((n3 - 1) shl 2) or (n4 shl 4);
чтение
n1 := v and $1;
n2 := (v shr 1) and $1;
n3 := (v shr 2) and $3;
n4 := (v shr 4) and $ffff;
← →
Inovet © (2014-07-25 19:02) [11]> [10] Inovet © (25.07.14 19:01)
> Будет по позициям
> 44443321
44444444444444443321
← →
Inovet © (2014-07-25 19:04) [12]> [10] Inovet © (25.07.14 19:01)
> n3 := (v shr 2) and $3;
ну и это тоже поправим
n3 := ((v shr 2) and $3) + 1;
← →
VICTOR_ (2014-07-25 19:17) [13]У меня вышло что-то такое
var
i : integer;
begin
//пример установления максимальных значений
i := (i or (1 shl 0));//1 число - 1
i := (i or (1 shl 1));//2 число - 1
i := (i or (4 shl 2));//3 число - 4
i := (i or (65535 shl 5));//4 число - 65535
ShowMessage(IntToStr((i shr 0) and $1));
ShowMessage(IntToStr((i shr 1) and $1));
ShowMessage(IntToStr((i shr 2) and $7));
ShowMessage(IntToStr((i shr 5) and $FFFF));
← →
VICTOR_ (2014-07-25 19:22) [14]Сори упустил
1..4
Прочитал как 0..4
← →
VICTOR_ (2014-07-25 19:40) [15]Теперь вышло как у
Inovet ©var
a,b,c,d,i : integer;
begin
//пример установления максимальных значений
a := 1;//1 число
b := 1;//2 число
c := 4;//3 число
d := 65535;//4 число
i := (a shl 0) or (b shl 1)or ((c - 1) shl 2) or (d shl 4);
ShowMessage("a = " + IntToStr((i shr 0) and $1));
ShowMessage("b = " + IntToStr((i shr 1) and $1));
ShowMessage("c = " + IntToStr(((i shr 2) and $3) + 1));
ShowMessage("d = " + IntToStr((i shr 4) and $FFFF));
end;
← →
Германн © (2014-07-26 02:21) [16]
> Andryk © (25.07.14 18:59) [9]
>
> Ну в принципе можно и OR особой разницы нет
В принципе нельзя! Результат XOR зависит от прежнего состояния переменной. А кто отвечает за это прежнее состояние? Пушкин?
Так что особая разница таки есть!
← →
Германн © (2014-07-26 02:25) [17]
> AngryOwl (25.07.14 17:38)
>
> Есть Integer-параметр функции. Нужно как-то записать в него
> четыре значения, используя битовую логику.
А вот скажи мне зачем тебе лично это нужно?
← →
Дмитрий СС (2014-07-27 21:00) [18]Мне б ваши проблемы :)
← →
Inovet © (2014-07-27 21:23) [19]> [18] Дмитрий СС (27.07.14 21:00)
У тебя трибит?
← →
Andryk © (2014-07-28 08:30) [20]
> Германн © (26.07.14 02:21) [16]
Да согласен, подзабыл малость...
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2015.03.08;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.002 c