Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Неужели невозможно?


Автор: Jimmy 13.5.2003, 16:34
Товарищи программеры...
не пойму чё то, неужели нельзя переменной присвоить двоичный код?
Или можно? Но как?
Я конечно понимаю, это "клин". Клинит меня, но вспомнить не могу и найти тоже не могу, как это сделать.
вот к примеру 16-ричный код, это понятно

int S = 0x0000ffff;

а .... двоичный то как?

confused.gif

Автор: Royan 13.5.2003, 22:58
в этом нет необходимости и сделать это нельзя, хотя можно вайти из ситуации проиницилизировав перемнную двоично-десятичным кодом, то бишь записав 0 и 1 в строку, например так: "1011010"

Автор: Jimmy 14.5.2003, 11:07
Ммммм.... не понял!!!
то есть как?


так?

a = 11001010; // что в принципе не верно!!!
или так?

a = "11001010"; // confused.gifconfused.gif

или я чего то не понимаю?

Спасибо конечно за ответ. Но нельзя ли разьяснить. Был бы очень благодарен!!!




Автор: DENNN 14.5.2003, 12:00
Да он и сам не знает smile.gif

Автор: Dov 14.5.2003, 12:36
Можно получить значение переменной в двоичном коде, используя itoa,
ввиде строки, разумеется.

Автор: neutrino 15.5.2003, 11:05
Можно написать :#define с макросом и менять каждые 4 бита на шестнадцатиричную цифру. Что то типа:
Код

int Num= b(1010)-(1100)-(0110)-(1110);

и потом менять на:
Код

int Num=0xAC6E;

Автор: man2002ua 15.5.2003, 11:34
Проще сделать ф-ю преобразования из строки в число и наоборот, и не парить себе мозги.

Автор: Baa 15.5.2003, 14:28
man2002ua, проще запустить calc.exe =) и вообще не парить никому ничего smile.gif

Автор: man2002ua 15.5.2003, 14:32
И вообще - счеты - лучший калькулятор, а калькуляотр БК-52 - лучший компутер!!

Чтобы сие не было чистым оффтопиком скажу, что в BCB и Delphi есть BinToHex и HexToBin

Автор: neutrino 15.5.2003, 15:53
Да вообще почему бы не писать на асме? Там можно указать в бинарном виде.
А почему Вас, господин Jimmy, не устраивает шестнадцатиричная система счисления? Ведь она также удобна, как и двоичная...

Автор: DENNN 16.5.2003, 14:57
Цитата
А почему Вас, господин Jimmy, не устраивает шестнадцатиричная система счисления? Ведь она также удобна, как и двоичная..

Потому собственно и используется smile.gif

Автор: 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 smile.gif
тем более, что в его конструктор можно передать значение вида const string& smile.gif

Автор: DarkDS 20.5.2003, 11:39
Цитата(HexoGenus @ 19.5.2003, 21:03)
Не smile.gif
int c=0x001b;
ShowMessage(с);
выводит 27 (1*16^1+11*16^0) smile.gif т.е. это шестнадцатеричная система smile.gif
но прикол же я нашел smile.gif
int c=010;
ShowMessage(с);
как думаете какое число выдаст? первая цифра 0!!!
в результате получаем 8!!!!
т.е. восьмеричная система smile.gif
Так что остерегайтесь нулей впереди стоящих smile.gif)))

кстати кто сможет объяснить почему не работает
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(с);

int c=0x001b; и будет выдавать 27, так как 0х - означает что использована шеснадцатеричная система, а это цифры 0-9, a(10), b(11), c(12), d(13), е(14), f(15)
А то что 010 - это 8 во всех учебниках по Си пишут.
А с массивом не работает, так как ты приводишь массив булов к инту...
Кстати... Я как то видел разбиение на старший и младший части байта с помошью union... Может и тут пойдет smile.gif

Автор: 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)? wink.gif
тут токо битовые поля помогут smile.gif

Автор: vickr 20.5.2003, 16:28
Цитата
кстати кто сможет объяснить почему не работает
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(с);

ShowMessage выводит 0 и правильно делает. Это 1-й элемент массива. А тебя что не устроило?

Автор: DENNN 20.5.2003, 16:32
Цитата
sizeof (d)?

=32 и что дальше?
sizeof дает размерность массива, а не число байт которые он занимает. Тебя же не удивляет, что оператор [] возвращает верный результат, а не байт с 8 элементами?
Проблемы, связанные с тем что bool это в сущности бит возникаеют при использовании vector<bool>, но это уже другая песня....

Автор: Step 20.5.2003, 16:50
товарищи, а вы через асм всавку не хотите сделать с дефайном

Автор: DENNN 20.5.2003, 16:52
Цитата
товарищи, а вы через асм всавку не хотите сделать с дефайном

Сначала надо определиться что нужно, а потом уже вставки изобретать smile.gif

Автор: Step 20.5.2003, 17:07
вопрос человек поставлен в принциае коректно, он даже пример дал для 16 системы, что тут определяться

Автор: Nastya 20.5.2003, 17:33
Нет в С использование двоичных констант принципе не возможно.

Числовые константы могут быть в десятичном, шестнадцатиричном (начинаться с 0x) и восмиричном виде (начинатся с 0).

Автор: Baa 20.5.2003, 19:24
Цитата(DENNN @ 20.5.2003, 16:32)
=32 и что дальше?
sizeof дает размерность массива, а не число байт которые он занимает. Тебя же не удивляет, что оператор [] возвращает верный результат, а не байт с 8 элементами?
Проблемы, связанные с тем что bool это в сущности бит возникаеют при использовании vector<bool>, но это уже другая песня....

А вот и ничего подобного! sizeof дает число занимаемых байт!
А кол-во элементов вычисляется так: sizeof (b)/sizeof(b[0])

Автор: Baa 20.5.2003, 21:10
Цитата(vickr @ 20.5.2003, 16:28)
ShowMessage выводит 0 и правильно делает. Это 1-й элемент массива. А тебя что не устроило?

Тут опять не совсем верно... 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
Цитата
Тут опять не совсем верно... 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'у.

Согласен, допустил неточность, приведение имени массива (bool*) к (int*) дает нам действительно первых 4 байта, а не 1 ( интересный результат дает попытка пройтись по массиву используя арифметику указателей - g++ несколько раз smile.gif ). Но непонятно, о чем изначально вопрос - массив-то в вопросе инициализирован как {0,0,0,0,...}, так что и первый элемент, и первые 4 дают одно и то же - 0.
Так что меня удивила формулировка вопроса "Почему это не работает?". Сам, правда, стараюсь не делать таких "зависящих от реализации" (по Страуструпу) преобразований.

Автор: HexoGenus 22.5.2003, 07:44
Цитата
А с массивом не работает, так как ты приводишь массив булов к инту...


Хммм... ну привожу... я что думаете этого не понимаю?
я не понимаю другого...
указатель это адрес в памяти ? так.
По этому адресу я в виде булов укладываю нолики и единички побитово...
потом то что хранится по этому адресу я принудительно считаю массивом интовским и 32 бита должны стать как раз одним интовским числом...
....
так почему это не работает? может к примеру адрес буловских указателей длиннее? или преобразование указателей можно как-то по особому выполнить... в конце концов это адрес в памяти или все же какое то смещение которое у интовского и булевого типа идут из разных точек?
Кто знает?

Автор: vickr 22.5.2003, 10:14
Цитата
Хммм... ну привожу... я что думаете этого не понимаю?
я не понимаю другого...
указатель это адрес в памяти ? так.
По этому адресу я в виде булов укладываю нолики и единички побитово...
потом то что хранится по этому адресу я принудительно считаю массивом интовским и 32 бита должны стать как раз одним интовским числом...

Так вот в чем проблема! Ты бы сразу написал, что там "не работает" smile.gif
еще раз спорный фрагмент:
Код

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;

Итак, что здесь происходит:
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 бита (причем старший разряд - знаковый). Вот вроде и все. Прошу прощения за некоторую косноязычность smile.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)