Вопрос по работе And, Or и Xor

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Вопрос по работе And, Or и Xor

Сообщение fs444 » 13.09.2008 00:22:28

Почему
1365 Or 2730 = 4095,
1365 Xor 2730 = 4095,
-256 Or 256 = -1 и
-256 Xor 256 = -1 ?
Вроде все, что до 0 - это False, а от 0 и выше - это True. Или 0 и 1. Должно же быть
1365 Or 2730 = 1,
1365 Xor 2730 = 1,
-256 Or 256 = 1 и
-256 Xor 256 = 1 ?
fs444
новенький
 
Сообщения: 38
Зарегистрирован: 09.09.2008 23:55:30

Re: Вопрос по работе And, Or и Xor

Сообщение B4rr4cuda » 13.09.2008 00:44:07

Потому, что это:
010101010101 or 101010101010 = 111111111111(bin) = 4095 (dec)
и тд...
Последний раз редактировалось B4rr4cuda 13.09.2008 00:45:37, всего редактировалось 1 раз.
Аватара пользователя
B4rr4cuda
энтузиаст
 
Сообщения: 693
Зарегистрирован: 28.12.2007 07:48:35

Re: Вопрос по работе And, Or и Xor

Сообщение Deepthroat » 13.09.2008 00:44:45

True и False - это значения типа Boolean, а 0, 1, больше нуля или меньше - это числовые типы, например, Integer. Паскаль вам не C, здесь числовые типы не заменяют собой логический.

То, что вы написали - это побитовые операции, применяемые к типу Integer (как вариант, LongInt, Cardinal и т.п.), короче, к целым числам. Итак, смотрим (для знаковых целых 16-разрядных):

Код: Выделить всё
1365 or 2730  = 0000 0101 0101 0101 or  0000 1010 1010 1010 = 0000 1111 1111 1111 = 4095,
1365 xor 2730 = 0000 0101 0101 0101 xor 0000 1010 1010 1010 = 0000 1111 1111 1111 = 4095,

-256 or 256  = 1111 1110 1111 1111 or  0000 0001 0000 0000 = 1111 1111 1111 1111 = -1,
-256 xor 256 = 1111 1110 1111 1111 xor 0000 0001 0000 0000 = 1111 1111 1111 1111 = -1.
Аватара пользователя
Deepthroat
постоялец
 
Сообщения: 144
Зарегистрирован: 06.09.2007 00:21:34
Откуда: Outer Heaven

Re: Вопрос по работе And, Or и Xor

Сообщение *vmr » 13.09.2008 00:51:28

Внимательно следи за движением рук :)

1365 Or 2730 = 4095

Код: Выделить всё
010101010101 Or
101010101010 =
111111111111


1365 Xor 2730 = 4095

Код: Выделить всё
010101010101 Xor
101010101010 =
111111111111



-256 Or 256 = -1

А для 16-битного целого будет -256 :)
Код: Выделить всё
1111111100000000 Or
0000000100000000 = -1


-256 Xor 256 = -1 ?

Результат тоже отличается от 32-битного: -512
Код: Выделить всё
1111111100000000 Xor
0000000100000000 =
1111111000000000


Вроде все, что до 0 - это False, а от 0 и выше - это True. Или 0 и 1. Должно же быть

Не надо путать логические операции с битовыми

Булевые правильно работают только если операнды однобитные, т.е 0 либо 1

Добавлено спустя 54 секунды:
пока писал ответ, уже успели напостить... :)
Аватара пользователя
*vmr
постоялец
 
Сообщения: 168
Зарегистрирован: 08.01.2007 01:46:07
Откуда: Киев

Re: Вопрос по работе And, Or и Xor

Сообщение SII » 13.09.2008 08:13:57

fs444
Не надо путать Паскаль и Си. В Паскале есть отдельный логический (Boolean) тип, в Си такового нет. Поэтому в Си в качестве логических рассматриваются обычные числовые значения: 0 -- ложь, не 0 -- истина. По этой же причине там потребовалось ввести разные обозначения для операций над логическими величинами и над числами (например, | и ||). Это один из основных источников ошибок в программах на Си. В Паскале же всё проще: если операнды имеют логический тип, то AND, OR, XOR, NOT выполняют логические операции и дают в результате логическое значение, ну а если операнды имеют целочисленный тип, то выполняются побитовые операции, на выходе дающие целое число.
SII
новенький
 
Сообщения: 64
Зарегистрирован: 24.06.2007 17:15:09
Откуда: Зеленоград

Re: Вопрос по работе And, Or и Xor

Сообщение fs444 » 13.09.2008 13:44:26

А чем отличаются 16-битные целые от 32-битных?

Почему
Код: Выделить всё
1111111100000000 Or
0000000100000000 = -1

?

Это же будет 1111111100000000, то есть 65280

Как преобразовать положительное в отрицательное в двоичном виде? Например, 256 = 100000000. А чему в двоичной будет равно -256 ?
fs444
новенький
 
Сообщения: 38
Зарегистрирован: 09.09.2008 23:55:30

Re: Вопрос по работе And, Or и Xor

Сообщение *vmr » 13.09.2008 18:25:03

fs444 писал(а):А чем отличаются 16-битные целые от 32-битных?

Номером знакового бита
А от этого бита зависит дальнейшее трактование числа

Добавлено спустя 7 минут 39 секунд:
fs444 писал(а):Это же будет 1111111100000000, то есть 65280

Это для тридцатидвухбитного...
а для 16-битного знаковый бит установлен в 1, т.е. число отрицательное. Биты инвертируются(000000011111111) и добавляется еденица. Получается 000000011111111 + 1 = 0000000100000000 = 256. А поскольку установлен знаковй бит то число будет отрицательым, т.е -256
Аватара пользователя
*vmr
постоялец
 
Сообщения: 168
Зарегистрирован: 08.01.2007 01:46:07
Откуда: Киев

Re: Вопрос по работе And, Or и Xor

Сообщение serg_iv » 13.09.2008 18:34:23

Как преобразовать положительное в отрицательное в двоичном виде? Например, 256 = 100000000. А чему в двоичной будет равно -256 ?

Положительное можно преобразовать в отрицательное так:
инверсия всех битов + 1:
например в четырехразрядной системе:
3 - 0011
-3 - 1101;
serg_iv
постоялец
 
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

Re: Вопрос по работе And, Or и Xor

Сообщение fs444 » 17.09.2008 00:21:52

Вроде разобрался..
fs444
новенький
 
Сообщения: 38
Зарегистрирован: 09.09.2008 23:55:30

Re: Вопрос по работе And, Or и Xor

Сообщение fs444 » 19.09.2008 23:43:57

Пишу
Код: Выделить всё
WriteLn(-256 And 256);
WriteLn(-256 Or 256);
WriteLn(-256 Xor 256);

И программа вместо
0
-1
-1

выдает
256
-256
512

Почему?
fs444
новенький
 
Сообщения: 38
Зарегистрирован: 09.09.2008 23:55:30

Re: Вопрос по работе And, Or и Xor

Сообщение SII » 20.09.2008 03:18:20

FFFFFF00 and 00000100 чему равно? Первое число -- это -256, второе -- просто 256
SII
новенький
 
Сообщения: 64
Зарегистрирован: 24.06.2007 17:15:09
Откуда: Зеленоград

Re: Вопрос по работе And, Or и Xor

Сообщение vunder » 20.09.2008 12:45:04

SII писал(а):FFFFFF00 and 00000100 чему равно? Первое число -- это -256, второе -- просто 256

256
vunder
незнакомец
 
Сообщения: 6
Зарегистрирован: 10.01.2007 13:17:57

Re: Вопрос по работе And, Or и Xor

Сообщение fs444 » 21.09.2008 00:42:34

А я не знаю, как сравнить FFFFFF00 и 00000100 :) Объясни пожалуйста.
fs444
новенький
 
Сообщения: 38
Зарегистрирован: 09.09.2008 23:55:30

Re: Вопрос по работе And, Or и Xor

Сообщение SII » 21.09.2008 01:16:00

Не сравнить, а выполнить операцию "логическое и" (AND). Она выполняется поразрядно (т.е. нулевой разряд первого операнда с нулевым разрядом второго операнда дают нулевой разряд результата, первые разряды -- первый разряд и т.д.). Для каждого разряда (т.е. одной двоичной цифры, бита):

0 and 0 = 0
0 and 1 = 0
1 and 0 = 0
1 and 1 = 1

Т.е. единица на выходе будет только в том случае, если единицы присутствуют в первом И втором операндах одновременно (отсюда и название -- И).

Переводим числа из шестнадцатеричной записи в двоичную и смотрим, что получается:

Код: Выделить всё
FFFFFF00 = 1111 1111 1111 1111 1111 1111 0000 0000
00000100 = 0000 0000 0000 0000 0000 0001 0000 0000
                 --------------------------------------------------
                 0000 0000 0000 0000 0000 0001 0000 0000


Только 8-й разряд в обоих операндах равен 1, поэтому на выходе и получаем число 256 (100 в шестнадцатеричной системе).

Добавлено спустя 2 минуты 3 секунды:
Блин, получилось криво, а редактирования не вижу :((( Просьба модераторам поправить.
SII
новенький
 
Сообщения: 64
Зарегистрирован: 24.06.2007 17:15:09
Откуда: Зеленоград

Re: Вопрос по работе And, Or и Xor

Сообщение fs444 » 21.09.2008 01:24:33

А зачем ты их до этого в шестнадцатиричную переводил?
fs444
новенький
 
Сообщения: 38
Зарегистрирован: 09.09.2008 23:55:30

След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru
cron