| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Неужели невозможно? |
| Автор: Jimmy 13.5.2003, 16:34 |
| Товарищи программеры... не пойму чё то, неужели нельзя переменной присвоить двоичный код? Или можно? Но как? Я конечно понимаю, это "клин". Клинит меня, но вспомнить не могу и найти тоже не могу, как это сделать. вот к примеру 16-ричный код, это понятно int S = 0x0000ffff; а .... двоичный то как? |
| Автор: Royan 13.5.2003, 22:58 |
| в этом нет необходимости и сделать это нельзя, хотя можно вайти из ситуации проиницилизировав перемнную двоично-десятичным кодом, то бишь записав 0 и 1 в строку, например так: "1011010" |
| Автор: Jimmy 14.5.2003, 11:07 |
| Ммммм.... не понял!!! то есть как? так? a = 11001010; // что в принципе не верно!!! или так? a = "11001010"; // или я чего то не понимаю? Спасибо конечно за ответ. Но нельзя ли разьяснить. Был бы очень благодарен!!! |
| Автор: DENNN 14.5.2003, 12:00 |
| Да он и сам не знает |
| Автор: Dov 14.5.2003, 12:36 |
| Можно получить значение переменной в двоичном коде, используя itoa, ввиде строки, разумеется. |
| Автор: neutrino 15.5.2003, 11:05 | ||||
Можно написать :#define с макросом и менять каждые 4 бита на шестнадцатиричную цифру. Что то типа:
и потом менять на:
|
| Автор: man2002ua 15.5.2003, 11:34 |
| Проще сделать ф-ю преобразования из строки в число и наоборот, и не парить себе мозги. |
| Автор: Baa 15.5.2003, 14:28 |
| man2002ua, проще запустить calc.exe =) и вообще не парить никому ничего |
| Автор: man2002ua 15.5.2003, 14:32 |
| И вообще - счеты - лучший калькулятор, а калькуляотр БК-52 - лучший компутер!! Чтобы сие не было чистым оффтопиком скажу, что в BCB и Delphi есть BinToHex и HexToBin |
| Автор: neutrino 15.5.2003, 15:53 |
| Да вообще почему бы не писать на асме? Там можно указать в бинарном виде. А почему Вас, господин Jimmy, не устраивает шестнадцатиричная система счисления? Ведь она также удобна, как и двоичная... |
| Автор: DENNN 16.5.2003, 14:57 | ||
Потому собственно и используется |
| Автор: Unregistered1 18.5.2003, 17:48 |
| Точно не помню. А если попробовать 0x00001111b - помоему так |
| Автор: HexoGenus 19.5.2003, 21:03 |
| Не :) int c=0x001b; ShowMessage(с); выводит 27 (1*16^1+11*16^0) :) т.е. это шестнадцатеричная система :) но прикол же я нашел :) int c=010; ShowMessage(с); как думаете какое число выдаст? первая цифра 0!!! в результате получаем 8!!!! т.е. восьмеричная система :) Так что остерегайтесь нулей впереди стоящих :)))) кстати кто сможет объяснить почему не работает bool d[32]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1}; int *g=(int *)d; int c=*g; ShowMessage(с); |
| Автор: DENNN 20.5.2003, 09:58 |
| Потому, что для работы с массивом bool лучше воспользоваться bitset тем более, что в его конструктор можно передать значение вида const string& |
| Автор: DarkDS 20.5.2003, 11:39 | ||
int c=0x001b; и будет выдавать 27, так как 0х - означает что использована шеснадцатеричная система, а это цифры 0-9, a(10), b(11), c(12), d(13), е(14), f(15) А то что 010 - это 8 во всех учебниках по Си пишут. А с массивом не работает, так как ты приводишь массив булов к инту... Кстати... Я как то видел разбиение на старший и младший части байта с помошью union... Может и тут пойдет |
| Автор: Baa 20.5.2003, 14:25 |
| bool d[32]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1}; sizeof (d)? тут токо битовые поля помогут |
| Автор: vickr 20.5.2003, 16:28 | ||
ShowMessage выводит 0 и правильно делает. Это 1-й элемент массива. А тебя что не устроило? |
| Автор: DENNN 20.5.2003, 16:32 | ||
=32 и что дальше? sizeof дает размерность массива, а не число байт которые он занимает. Тебя же не удивляет, что оператор [] возвращает верный результат, а не байт с 8 элементами? Проблемы, связанные с тем что bool это в сущности бит возникаеют при использовании vector<bool>, но это уже другая песня.... |
| Автор: Step 20.5.2003, 16:50 |
| товарищи, а вы через асм всавку не хотите сделать с дефайном |
| Автор: DENNN 20.5.2003, 16:52 | ||
Сначала надо определиться что нужно, а потом уже вставки изобретать |
| Автор: Step 20.5.2003, 17:07 |
| вопрос человек поставлен в принциае коректно, он даже пример дал для 16 системы, что тут определяться |
| Автор: Nastya 20.5.2003, 17:33 |
| Нет в С использование двоичных констант принципе не возможно. Числовые константы могут быть в десятичном, шестнадцатиричном (начинаться с 0x) и восмиричном виде (начинатся с 0). |
| Автор: Baa 20.5.2003, 19:24 | ||
А вот и ничего подобного! sizeof дает число занимаемых байт! А кол-во элементов вычисляется так: sizeof (b)/sizeof(b[0]) |
| Автор: Baa 20.5.2003, 21:10 | ||
Тут опять не совсем верно... 0 это хоть и первый элемент массива, но дело не в этом... bool d[32]={0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1}; Если так написать, то чего выведет? Прально, 256, потому как берется 4 первых байта из массива при приведении к int'у. |
| Автор: vickr 21.5.2003, 09:39 | ||
Согласен, допустил неточность, приведение имени массива (bool*) к (int*) дает нам действительно первых 4 байта, а не 1 ( интересный результат дает попытка пройтись по массиву используя арифметику указателей - g++ несколько раз Так что меня удивила формулировка вопроса "Почему это не работает?". Сам, правда, стараюсь не делать таких "зависящих от реализации" (по Страуструпу) преобразований. |
| Автор: HexoGenus 22.5.2003, 07:44 | ||
Хммм... ну привожу... я что думаете этого не понимаю? я не понимаю другого... указатель это адрес в памяти ? так. По этому адресу я в виде булов укладываю нолики и единички побитово... потом то что хранится по этому адресу я принудительно считаю массивом интовским и 32 бита должны стать как раз одним интовским числом... .... так почему это не работает? может к примеру адрес буловских указателей длиннее? или преобразование указателей можно как-то по особому выполнить... в конце концов это адрес в памяти или все же какое то смещение которое у интовского и булевого типа идут из разных точек? Кто знает? |
| Автор: vickr 22.5.2003, 10:14 | ||||
Так вот в чем проблема! Ты бы сразу написал, что там "не работает" еще раз спорный фрагмент:
Итак, что здесь происходит: 1 строка: объявление массива из 32 bool с инициализацией: в памяти выделяется 32 байта (а не бита), т.е. каждый 0 или 1 занимают по 1 байту. Что касается d, то это, фактически, 4-байтный указатель на первый элемент массива (который, в свою очередь, имеет тип bool и занимает, таким образом 1 байт). 2 и 3 строка: Такому же 4-байтному указателю g присваивается адрес первого элемента массива, на первый взгляд, но (важный момент) - если ты прочитаешь значение, записанное по адресу g (int c = *g), то обнаружишь, что ты прочитал превые 4 элемента. Это происходит потому, что b и g - типизированные указателт. В общем, я увлекся. Baa до меня написал о том же, только короче. Короче, по адресу d хранится 00000000, 00000000, ..., 00000001 - всего 32 байта. Ты же ожидаешь там увидеть 00000000000000000000000000000111, т.е. значение типа int, 32 бита (причем старший разряд - знаковый). Вот вроде и все. Прошу прощения за некоторую косноязычность |