Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.03.08;
Скачать: CL | DM;

Вниз

Битовая логика   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.008 c
2-1391182666
Мишаня
2014-01-31 19:37
2015.03.08
Как узнать количество дней выбранного месяца?


15-1406406602
Юрий
2014-07-27 00:30
2015.03.08
С днем рождения ! 27 июля 2014 воскресенье


15-1406016299
Dmitry_Wellington
2014-07-22 12:04
2015.03.08
HTML5 vs Obj-C. Что быстрее выучить?


11-1259084014
Егорка
2009-11-24 20:33
2015.03.08
LVCustomDraw


15-1406295490
AngryOwl
2014-07-25 17:38
2015.03.08
Битовая логика