Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
9 / 9 / 3
Регистрация: 11.12.2012
Сообщений: 152

Работа с битами

07.09.2013, 10:12. Показов 1145. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем вот локальная проблема: есть int, который выступает в роли сетки нулей и единиц, два примера, разницу между которыми не могу устранить:
1)
C++
1
2
int tmp = - INT_MAX /*1111 1111 1111 1111 1111 1111 1111 1111*/
tmp = tmp ^ 3 /*(1)111 1111 1111 1111 1111 1111 1111 11(10)*/
2)
C++
1
2
int tmp = - INT_MAX /*1111 1111 1111 1111 1111 1111 1111 1111*/
tmp = tmp ^ (-3) /*(0)111 1111 1111 1111 1111 1111 1111 11(00)*/
проблема в первом бите результата первого случая (если считать от нулевого бита), там стоит единица, а ожидается нуль. Можно ли выйти из этой ситуации или придётся всегда следить за знаками операндов? И ещё хотел бы узнать, в чём такая причина, связано ли это с тем, что INT_MIN по модулю больше -INT_MAX и как этого избежать в рамках поставленного примера.

Добавлено через 8 минут
аааааа, тему закрывайте, я разобрался, я думал что бит знака - крайний слева, а он ведь на самом деле нулевой, самый крайний справа!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.09.2013, 10:12
Ответы с готовыми решениями:

Работа с битами И Работа с символьными данными
1. Ввести 8 символов. В символе с наибольшим кодом заменить 5-й бит единицей, а в символе с наименьшим кодом 6-й бит - нулем. Вывести...

Работа с битами.
Здрасте. Дана задача: Определить на сколько в числе А больше значущих битов, что равны единице, чем битов, что равны нулю. Помогите...

Работа с битами.
помогите!! как писать эту на программе с++ Ввести последовательность из 8 символов. Сравнить 5-й и 6-й биты каждого символа. Если они...

3
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
07.09.2013, 10:16
я что то не могу понять что ты написал (красным)
ты представляешь что такое двоичное представление числа?
возьмем к примеру char (мне лень писать кучу единиц)
максимальное значение char 127=0111 111
минимальное -128=1000 0000
сделаем -(минус) максимальное, это инвертировать все биты и добавить 1
0111 1111
1000 0000
1000 0001
равно -127
теперь сделаем минимальное положительным( возьмем модуль)
1000 0000
0111 1111
+
0000 0001
=
1000 0000
от чего ушли к тому и пришли
вывод от минимального нельзя взять модуль
нет у char значения 128
так что
Цитата Сообщение от TamaGOch Посмотреть сообщение
INT_MIN по модулю больше -INT_MAX
сравнивать нельзя

Добавлено через 46 секунд
Цитата Сообщение от TamaGOch Посмотреть сообщение
аааааа, тему закрывайте, я разобрался, я думал что бит знака - крайний слева,
ага
Цитата Сообщение от TamaGOch Посмотреть сообщение
а он ведь на самом деле нулевой, самый крайний справа!
нет неправильно
1
9 / 9 / 3
Регистрация: 11.12.2012
Сообщений: 152
07.09.2013, 10:56  [ТС]
Ну да, на практике не вышло)) Вернулся)) Спасибо, буду разбираться

Добавлено через 7 минут
Вот в чём хочу разобраться:
C++
1
2
3
4
char tmp = 3; /*0000 0011*/
tmp = tmp ^ 1; /*0000 0010*/
tmp = -3; /*1000 0011*/
tmp = tmp ^ 1; /*1000 0100*/
однако хочется в последней операции получить значение tmp = -2, т.е. 1000 0010
как в таком случае:
C++
1
tmp = -(tmp ^ (-1)); /*1000 0010*/
Добавлено через 7 минут
в общем решил делать так
C++
1
2
3
4
int sign (int obj)
{
     return (obj < 0)? (-1) : 1;
}
C++
1
 tmp = sign(tmp)*(tmp ^ sign(tmp));
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
07.09.2013, 11:09
Цитата Сообщение от TamaGOch Посмотреть сообщение
char tmp = 3; /*0000 0011*/
правильно
Цитата Сообщение от TamaGOch Посмотреть сообщение
tmp = -3; /*1000 0011*/
неправильно
прочитай что такое дополнительный код
грубо говоря это код который дополняет до 0
-3+3=0
в двоичном виде
1111 1101(-3)
0000 0011(3)
=
0000 0000

подойдем по другому
0-3=-3
0000 0000(0)
-
0000 0011(3)
=
1111 1101(-3)

практически делается так инвертируются все биты и добавляется 1
0000 0011(3)
1111 1100(инверсия)
1111 1101(-3)

1111 1101(-3)
0000 0010(инверсия)
0000 0011(3)
Цитата Сообщение от TamaGOch Посмотреть сообщение
tmp = tmp ^ 1; /*0000 0010*/
правильно
Цитата Сообщение от TamaGOch Посмотреть сообщение
tmp = tmp ^ 1; /*1000 0100*/
неправильно
почитай что такое "исключающие или"(XOR)
вот таблица истинности
0^0=0
0^1=1
1^0=1
1^1=0
другими словами если биты равны то результат 0
если не равны то результат 1

используется часто для инверсии битов
например
0000 0011^0000 0001=0000 0010
0000 0010^0000 0001=0000 0011
или при шифровании( простейшем)
если число обработать XOR ключом, а потом еще раз то получим первоначальное число

Добавлено через 3 минуты
Цитата Сообщение от TamaGOch Посмотреть сообщение
однако хочется в последней операции получить значение tmp = -2, т.е. 1000 0010
-2 это 1111 1110
открой виндовый калькулятор в режиме программиста и посмотри как представляются числа

Добавлено через 3 минуты
Цитата Сообщение от TamaGOch Посмотреть сообщение
однако хочется в последней операции получить значение tmp = -2, т.е. 1000 0010
3^1=2;
0000 0011(3)
0000 0001(1)
=
0000 0010(2)

-3^1=-4
1111 1101(-3)
0000 0001(1)
=
1111 1100(-4)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.09.2013, 11:09
Помогаю со студенческими работами здесь

Работа с битами
Не могу понять, почему не правильно работает программа. Программа зашифровывает строку, выводит, потом расшифровывает и выводит. ...

работа с битами
доброй ночи, форумчане, необходима ваша помощь) как и всем тут... вот изучаю с++ и добрался до работы с битами, учу решением задач. на...

Работа с битами
три раза писал но все равно не получается((( 1-)Ввести последовательность из 8 символов. Сравнить 5-й и 6-й биты каждого символа. Если...

Работа с битами
Стоит задача: вывести все двоичные коды чисел от 0 и до 2n-1. Сделать напролом могу(переводить в цикле каждое число в двоичную с-му и...

Работа с битами
Я уже задолбался... :wall: Может мне кто нибудь подскажет как из 00111010 (58) получить 00001010 (10) хотя бы каким методом... код...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru