Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
15-1406550400
nokia4ever
2014-07-28 16:26
2015.03.08
перевод на дельфи


11-1258544846
Егорка
2009-11-18 14:47
2015.03.08
интерфейснутые классы


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


4-1271234220
QAZ
2010-04-14 12:37
2015.03.08
hook+service+uac+win7


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский