Ллирик
|
|
« : 13-07-2016 22:09 » |
|
Как записать число в двоичном представлении? Делаю так: (CHAR) *PcurData &= 0b0101; , получаю error C2059: syntax error : 'bad suffix on number'
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
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 секунду:Хотя, зачем всё это. Твоя задача решается проще
|
|
« Последнее редактирование: 14-07-2016 04:56 от Алексей1153 »
|
Записан
|
|
|
|
Вад
|
|
« Ответ #2 : 14-07-2016 08:30 » |
|
Ллирик, но ты тут ещё пытаешься в строковом виде представить.
Не факт - может, там разыменование указателя с приведением к типу CHAR (оператор &= как бы намекает). Только непонятно тогда, зачем приведение. А так, ошибка в использовании старого компилятора или компиляции без ключа поддержки новых фич языка (0b доступно только начиная с c++x14).
|
|
« Последнее редактирование: 14-07-2016 08:34 от Вад »
|
Записан
|
|
|
|
Ллирик
|
|
« Ответ #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 от Ллирик »
|
Записан
|
|
|
|
Вад
|
|
« Ответ #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 нет
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #5 : 15-07-2016 06:07 » |
|
Вад, кстати, да, "0b..." в mingw проканало с опцией CONFIG+=c++14 прикольно В студии по умолчанию cl используется, он не умеет новые фичи C++ Добавлено через 5 минут и 31 секунду: Я хочу применить битовую операцию "OR" к байту, находящемуся в пуле по указателю в PcurData.
то есть, имеется в виду всё же
|
|
« Последнее редактирование: 15-07-2016 06:13 от Алексей1153 »
|
Записан
|
|
|
|
darkelf
Молодой специалист
Offline
|
|
« Ответ #6 : 15-07-2016 06:36 » |
|
Работу с голыми строками я сейчас не помню на память, всё больше классами пользуюсь )
*PcurData |= strtoul("0101", NULL, 2); Хотя, конечно, это не самый оптимальный вариант кода.
|
|
|
Записан
|
|
|
|
Ллирик
|
|
« Ответ #7 : 16-07-2016 16:06 » |
|
Добавлено через 5 минут и 31 секунду:[/size] Я хочу применить битовую операцию "OR" к байту, находящемуся в пуле по указателю в PcurData.
то есть, имеется в виду всё же Изв, точно)) совсем что-то я.......)) А какой компилятор мне тогда нужен для сборки драйвера, и ещё чтоб ассемблерные вставки в 64-битном режиме поддерживал?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #8 : 17-07-2016 09:19 » |
|
Ллирик, по драйверам подсказать ничего не могу. Компилятор у меня в примере был MinGW https://ru.wikipedia.org/wiki/MinGWс опцией CONFIG+=c++14 (собственно, он у меня поставился вместе с QtCreator ) Ассемблерные вставки сейчас, думаю, любые компиляторы поддерживают. А вообще, ради такой ерунды, как представление числа, менять компилятор - сомнительная радость. Можно записать числа в виде HEX , либо представить через макросы, которые я верху привёл
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #9 : 17-07-2016 11:27 » |
|
Ассемблерные вставки сейчас, думаю, любые компиляторы поддерживают.
Поддерживают, только синтаксис будет разный, т.е. нужно будет вставки конвертировать (хорошо, если найдётся тул, а то и вручную придётся). Вообще, если код сильно MS-специфичный (а MS любит понаворотить в языке/библиотеках такого, что потом ни один другой компилятор не разберёт), то проще будет взять свежий MS-компилятор с поддержкой нужных фич: если верить MSDN, компилятор из 2015й студии поддерживает двоичные литералы. Ну или брать любой другой современный компилятор: тот же GCC (в составе MinGW), или хоть Intel-овский взять (для драйверов может быть разумно, и со студией интегрируется). Но вообще, я согласен с Лёшей, что только ради двоичного представления менять компилятор - слишком много чести
|
|
« Последнее редактирование: 17-07-2016 11:30 от Вад »
|
Записан
|
|
|
|
Ллирик
|
|
« Ответ #10 : 17-07-2016 14:30 » |
|
В MinGW я почему-то не могу подключить инки ДДК. А современные компиляторы от МС стали поддерживать асм-вставки для х64?
|
|
|
Записан
|
|
|
|
Aether
|
|
« Ответ #11 : 17-07-2016 15:08 » |
|
Ассемблерные вставки сейчас, думаю, любые компиляторы поддерживают.
Можно записать числа в виде HEX , либо представить через макросы, которые я верху привёл
Меня смущают подобные вставки - как потом это будет разворачиваться - всегда вопрос. В общем случае, если появляется надобность в этом, то сопутствует мысль - почему бы весь код или его критичный участок не переводить на асм целиком. Ассемблеры, вроде NASM поддерживают, как х64 вычисления, так и привычный синтаксис Интела. При желании можно сделать, как объектный файл, так и DLL. Поддерживаю, 0101 = 0x05 = 5. Для себя в комментариях можно написать, что это значит "0101", хотя лучше вначале описывать готовые определения к маскам с подробным описанием, какой бит что означает.
|
|
|
Записан
|
|
|
|
|