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

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

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

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

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

Сообщение fs444 »

Почему
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 ?
Аватара пользователя
B4rr4cuda
энтузиаст
Сообщения: 693
Зарегистрирован: 28.12.2007 06:48:35

Сообщение B4rr4cuda »

Потому, что это:
010101010101 or 101010101010 = 111111111111(bin) = 4095 (dec)
и тд...
Последний раз редактировалось B4rr4cuda 13.09.2008 00:45:37, всего редактировалось 1 раз.
Аватара пользователя
Deepthroat
постоялец
Сообщения: 144
Зарегистрирован: 06.09.2007 00:21:34
Откуда: Outer Heaven
Контактная информация:

Сообщение Deepthroat »

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.
Аватара пользователя
*vmr
постоялец
Сообщения: 168
Зарегистрирован: 08.01.2007 00:46:07
Откуда: Киев
Контактная информация:

Сообщение *vmr »

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

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 секунды:
пока писал ответ, уже успели напостить... :)
SII
новенький
Сообщения: 64
Зарегистрирован: 24.06.2007 17:15:09
Откуда: Зеленоград

Сообщение SII »

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

Сообщение fs444 »

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

Почему

Код: Выделить всё

1111111100000000 Or 
0000000100000000 = -1

?

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

Как преобразовать положительное в отрицательное в двоичном виде? Например, 256 = 100000000. А чему в двоичной будет равно -256 ?
Аватара пользователя
*vmr
постоялец
Сообщения: 168
Зарегистрирован: 08.01.2007 00:46:07
Откуда: Киев
Контактная информация:

Сообщение *vmr »

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

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

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

Это для тридцатидвухбитного...
а для 16-битного знаковый бит установлен в 1, т.е. число отрицательное. Биты инвертируются(000000011111111) и добавляется еденица. Получается 000000011111111 + 1 = 0000000100000000 = 256. А поскольку установлен знаковй бит то число будет отрицательым, т.е -256
serg_iv
постоялец
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

Сообщение serg_iv »

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

Положительное можно преобразовать в отрицательное так:
инверсия всех битов + 1:
например в четырехразрядной системе:
3 - 0011
-3 - 1101;
fs444
новенький
Сообщения: 38
Зарегистрирован: 09.09.2008 23:55:30

Сообщение fs444 »

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

Сообщение fs444 »

Пишу

Код: Выделить всё

WriteLn(-256 And 256);
WriteLn(-256 Or 256);
WriteLn(-256 Xor 256);

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

выдает
256
-256
512

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

Сообщение SII »

FFFFFF00 and 00000100 чему равно? Первое число -- это -256, второе -- просто 256
vunder
незнакомец
Сообщения: 6
Зарегистрирован: 10.01.2007 12:17:57

Сообщение vunder »

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

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

Сообщение fs444 »

А я не знаю, как сравнить FFFFFF00 и 00000100 :) Объясни пожалуйста.
SII
новенький
Сообщения: 64
Зарегистрирован: 24.06.2007 17:15:09
Откуда: Зеленоград

Сообщение SII »

Не сравнить, а выполнить операцию "логическое и" (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 секунды:
Блин, получилось криво, а редактирования не вижу :((( Просьба модераторам поправить.
fs444
новенький
Сообщения: 38
Зарегистрирован: 09.09.2008 23:55:30

Сообщение fs444 »

А зачем ты их до этого в шестнадцатиричную переводил?
Ответить