Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Двоичное представление чисел  (Прочитано 15065 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Ллирик
Помогающий

ru
Offline Offline
Пол: Мужской

« : 13-07-2016 22:09 » 

Как записать число в двоичном представлении? Делаю так:
Код: (C)
(CHAR) *PcurData &= 0b0101;
, получаю
Цитата
error C2059: syntax error : 'bad suffix on number'
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 14-07-2016 04:48 » 

Ллирик, никак

я как-то себе делал макрос (но потом перестал им пользоваться, проще в HEX виде записать)

Код:
//двоичные числа
#define _b8(b) ((BYTE)(\
(b&0x10000000?0x80:0)|(b&0x01000000?0x40:0)|(b&0x00100000?0x20:0)|(b&0x00010000?0x10:0)|\
(b&0x00001000?0x08:0)|(b&0x00000100?0x04:0)|(b&0x00000010?0x02:0)|(b&0x00000001?0x01:0)))
#define _b16(b8H,b8L) ((WORD)((_b8(b8H)<<8)|_b8(b8L)))
#define __b16(b16) ((WORD)((_b8(((unsigned __int64)b16)>>32)<<8)|(_b8(b16))))
#define _b32(b8H,b8L,b8h,b8l) ((DWORD)(((_b16(b8H,b8L)<<16)|_b16(b8h,b8l))))
#define __b32(b16H,b16L) ((DWORD)(((__b16(b16H))<<16)|(__b16(b16L))))

//пример использования
//_b8(0xbbbbbbbb)
//__b16(0xbbbbbbbbbbbbbbbb)
//__b32(0xbbbbbbbbbbbbbbbb,0xbbbbbbbbbbbbbbbb)
//          b - это 1 или 0

Добавлено через 6 минут и 33 секунды:
Ллирик, но ты тут ещё пытаешься в строковом виде представить. Это отдельная задача. Работу с голыми строками я сейчас не помню на память, всё больше классами пользуюсь )

вот тут функции
https://msdn.microsoft.com/en-us/library/56e442dc.aspx


Добавлено через 51 секунду:
Хотя, зачем всё это. Твоя задача решается проще Отлично
Код:
CHAR* PcurData= "0101";
« Последнее редактирование: 14-07-2016 04:56 от Алексей1153 » Записан

Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 14-07-2016 08:30 » 

Ллирик, но ты тут ещё пытаешься в строковом виде представить.
Не факт - может, там разыменование указателя с приведением к типу CHAR (оператор &= как бы намекает). Только непонятно тогда, зачем приведение.

А так, ошибка в использовании старого компилятора или компиляции без ключа поддержки новых фич языка (0b доступно только начиная с c++x14).
« Последнее редактирование: 14-07-2016 08:34 от Вад » Записан
Ллирик
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 14-07-2016 16:12 » 

Ллирик, но ты тут ещё пытаешься в строковом виде представить.
Не факт - может, там разыменование указателя с приведением к типу CHAR (оператор &= как бы намекает). Только непонятно тогда, зачем приведение.

А так, ошибка в использовании старого компилятора или компиляции без ключа поддержки новых фич языка (0b доступно только начиная с c++x14).
Спасибо. Сейчас глянул, действительно старый компилятор.
Я хочу применить битовую операцию "OR" к байту, находящемуся в пуле по указателю в PcurData.


Добавлено через 2 часа и 27 секунд:
Нет...
Цитата
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.207 for 80x86
ошибка та же
« Последнее редактирование: 14-07-2016 18:12 от Ллирик » Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 14-07-2016 19:44 » 

Нет...
Цитата
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.207 for 80x86
ошибка та же
Это Visual Studio 2008? Тогда это очень старый компилятор, там даже c++11 нет
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 15-07-2016 06:07 » 

Вад, кстати, да, "0b..." в mingw проканало с опцией
CONFIG+=c++14

прикольно

В студии по умолчанию cl используется, он не умеет новые фичи C++

Добавлено через 5 минут и 31 секунду:

Я хочу применить битовую операцию "OR" к байту, находящемуся в пуле по указателю в PcurData.


то есть, имеется в виду всё же

Код:
(*PcurData) |= 0b0101;
« Последнее редактирование: 15-07-2016 06:13 от Алексей1153 » Записан

darkelf
Молодой специалист

no
Offline Offline

« Ответ #6 : 15-07-2016 06:36 » 

Работу с голыми строками я сейчас не помню на память, всё больше классами пользуюсь )
Код: (C)
*PcurData |= strtoul("0101", NULL, 2);

Хотя, конечно, это не самый оптимальный вариант кода.
Записан
Ллирик
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 16-07-2016 16:06 » 

Цитата: Алексей
[size=8pt
Добавлено через 5 минут и 31 секунду:[/size]

Я хочу применить битовую операцию "OR" к байту, находящемуся в пуле по указателю в PcurData.


то есть, имеется в виду всё же

Код:
(*PcurData) |= 0b0101;
Изв, точно)) совсем что-то я.......))
А какой компилятор мне тогда нужен для сборки драйвера, и ещё чтоб ассемблерные вставки в 64-битном режиме поддерживал?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 17-07-2016 09:19 » 

Ллирик, по драйверам подсказать ничего не могу.

Компилятор у меня в примере был MinGW  https://ru.wikipedia.org/wiki/MinGW
с опцией CONFIG+=c++14   (собственно, он у меня поставился вместе с QtCreator Отлично )

Ассемблерные вставки сейчас, думаю, любые компиляторы поддерживают.

А вообще, ради такой ерунды, как представление числа, менять компилятор - сомнительная радость. Можно записать числа в виде HEX , либо представить через макросы, которые я верху привёл
Записан

Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 17-07-2016 11:27 » 

Ассемблерные вставки сейчас, думаю, любые компиляторы поддерживают.
Поддерживают, только синтаксис будет разный, т.е. нужно будет вставки конвертировать (хорошо, если найдётся тул, а то и вручную придётся).

Вообще, если код сильно MS-специфичный (а MS любит понаворотить в языке/библиотеках такого, что потом ни один другой компилятор не разберёт), то проще будет взять свежий MS-компилятор с поддержкой нужных фич: если верить MSDN, компилятор из 2015й студии поддерживает двоичные литералы.
Ну или брать любой другой современный компилятор: тот же GCC (в составе MinGW), или хоть Intel-овский взять (для драйверов может быть разумно, и со студией интегрируется).

Но вообще, я согласен с Лёшей, что только ради двоичного представления менять компилятор - слишком много чести Улыбаюсь
« Последнее редактирование: 17-07-2016 11:30 от Вад » Записан
Ллирик
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 17-07-2016 14:30 » new

В MinGW  я почему-то не могу подключить инки ДДК. А современные компиляторы от МС стали поддерживать асм-вставки для х64?
Записан
Aether
Специалист

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 17-07-2016 15:08 » 

Ассемблерные вставки сейчас, думаю, любые компиляторы поддерживают.

Можно записать числа в виде HEX , либо представить через макросы, которые я верху привёл
Меня смущают подобные вставки - как потом это будет разворачиваться - всегда вопрос. В общем случае, если появляется надобность в этом, то сопутствует мысль - почему бы весь код или его критичный участок не переводить на асм целиком. Ассемблеры, вроде NASM поддерживают, как х64 вычисления, так и привычный синтаксис Интела. При желании можно сделать, как объектный файл, так и DLL.

Поддерживаю, 0101 = 0x05 = 5. Для себя в комментариях можно написать, что это значит "0101", хотя лучше вначале описывать готовые определения к маскам с подробным описанием, какой бит что означает.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines