Вопрос по работе And, Or и Xor
Модератор: Модераторы
Вопрос по работе And, Or и Xor
Почему
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 ?
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 ?
Потому, что это:
010101010101 or 101010101010 = 111111111111(bin) = 4095 (dec)
и тд...
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
- Контактная информация:
True и False - это значения типа Boolean, а 0, 1, больше нуля или меньше - это числовые типы, например, Integer. Паскаль вам не C, здесь числовые типы не заменяют собой логический.
То, что вы написали - это побитовые операции, применяемые к типу Integer (как вариант, LongInt, Cardinal и т.п.), короче, к целым числам. Итак, смотрим (для знаковых целых 16-разрядных):
То, что вы написали - это побитовые операции, применяемые к типу 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
- Откуда: Киев
- Контактная информация:
Внимательно следи за движением рук 
А для 16-битного целого будет -256
Результат тоже отличается от 32-битного: -512
Не надо путать логические операции с битовыми
Булевые правильно работают только если операнды однобитные, т.е 0 либо 1
Добавлено спустя 54 секунды:
пока писал ответ, уже успели напостить...
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 секунды:
пока писал ответ, уже успели напостить...
fs444
Не надо путать Паскаль и Си. В Паскале есть отдельный логический (Boolean) тип, в Си такового нет. Поэтому в Си в качестве логических рассматриваются обычные числовые значения: 0 -- ложь, не 0 -- истина. По этой же причине там потребовалось ввести разные обозначения для операций над логическими величинами и над числами (например, | и ||). Это один из основных источников ошибок в программах на Си. В Паскале же всё проще: если операнды имеют логический тип, то AND, OR, XOR, NOT выполняют логические операции и дают в результате логическое значение, ну а если операнды имеют целочисленный тип, то выполняются побитовые операции, на выходе дающие целое число.
Не надо путать Паскаль и Си. В Паскале есть отдельный логический (Boolean) тип, в Си такового нет. Поэтому в Си в качестве логических рассматриваются обычные числовые значения: 0 -- ложь, не 0 -- истина. По этой же причине там потребовалось ввести разные обозначения для операций над логическими величинами и над числами (например, | и ||). Это один из основных источников ошибок в программах на Си. В Паскале же всё проще: если операнды имеют логический тип, то AND, OR, XOR, NOT выполняют логические операции и дают в результате логическое значение, ну а если операнды имеют целочисленный тип, то выполняются побитовые операции, на выходе дающие целое число.
А чем отличаются 16-битные целые от 32-битных?
Почему
?
Это же будет 1111111100000000, то есть 65280
Как преобразовать положительное в отрицательное в двоичном виде? Например, 256 = 100000000. А чему в двоичной будет равно -256 ?
Почему
Код: Выделить всё
1111111100000000 Or
0000000100000000 = -1?
Это же будет 1111111100000000, то есть 65280
Как преобразовать положительное в отрицательное в двоичном виде? Например, 256 = 100000000. А чему в двоичной будет равно -256 ?
- *vmr
- постоялец
- Сообщения: 168
- Зарегистрирован: 08.01.2007 00:46:07
- Откуда: Киев
- Контактная информация:
fs444 писал(а):А чем отличаются 16-битные целые от 32-битных?
Номером знакового бита
А от этого бита зависит дальнейшее трактование числа
Добавлено спустя 7 минут 39 секунд:
fs444 писал(а):Это же будет 1111111100000000, то есть 65280
Это для тридцатидвухбитного...
а для 16-битного знаковый бит установлен в 1, т.е. число отрицательное. Биты инвертируются(000000011111111) и добавляется еденица. Получается 000000011111111 + 1 = 0000000100000000 = 256. А поскольку установлен знаковй бит то число будет отрицательым, т.е -256
Как преобразовать положительное в отрицательное в двоичном виде? Например, 256 = 100000000. А чему в двоичной будет равно -256 ?
Положительное можно преобразовать в отрицательное так:
инверсия всех битов + 1:
например в четырехразрядной системе:
3 - 0011
-3 - 1101;
Вроде разобрался..
Пишу
И программа вместо
выдает
Почему?
Код: Выделить всё
WriteLn(-256 And 256);
WriteLn(-256 Or 256);
WriteLn(-256 Xor 256);
И программа вместо
0
-1
-1
выдает
256
-256
512
Почему?
FFFFFF00 and 00000100 чему равно? Первое число -- это -256, второе -- просто 256
SII писал(а):FFFFFF00 and 00000100 чему равно? Первое число -- это -256, второе -- просто 256
256
А я не знаю, как сравнить FFFFFF00 и 00000100
Объясни пожалуйста.
Не сравнить, а выполнить операцию "логическое и" (AND). Она выполняется поразрядно (т.е. нулевой разряд первого операнда с нулевым разрядом второго операнда дают нулевой разряд результата, первые разряды -- первый разряд и т.д.). Для каждого разряда (т.е. одной двоичной цифры, бита):
0 and 0 = 0
0 and 1 = 0
1 and 0 = 0
1 and 1 = 1
Т.е. единица на выходе будет только в том случае, если единицы присутствуют в первом И втором операндах одновременно (отсюда и название -- И).
Переводим числа из шестнадцатеричной записи в двоичную и смотрим, что получается:
Только 8-й разряд в обоих операндах равен 1, поэтому на выходе и получаем число 256 (100 в шестнадцатеричной системе).
Добавлено спустя 2 минуты 3 секунды:
Блин, получилось криво, а редактирования не вижу
(( Просьба модераторам поправить.
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 секунды:
Блин, получилось криво, а редактирования не вижу
А зачем ты их до этого в шестнадцатиричную переводил?
