Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > 120 в виде 1111000


Автор: new_web 13.2.2008, 20:32
Как представить компилятору число в  виде едениц и нулей
чтобы он понял
что, например, 
1111000 это не один миллион стоодиннадцать тысяч, а именно 120 в его двоичном представлении?

Builder 6

Автор: susanin 13.2.2008, 20:39
я конечно не уверен, потому что сам еще новичок...но боюсь что никак нельзя....если только функцией перевести введенное число из 2 сс в 10 сс

Автор: jonie 13.2.2008, 20:40
компилятор не умеет понимать 2-ый формат. Используйте 16,8,10 основания СС. Перевести не составлят труда даже в уме.

Автор: Fazil6 13.2.2008, 21:06
Код

#include<math.h>
#include<iostream>
#include <string>
#include <algorithm>

namespace BIN_OPERATIONS
{

int binToint(const std::string &s1)
{// перевод строки в 10-е число
    int z1 = 0;
    for(int i = (int)s1.length() - 1; i > -1  ; --i)
    {
        if((s1[i] != '0') && (s1[i] != '1')) 
            throw std::runtime_error("not bin symbol") ;

        if((s1[i] - '0'))
            z1 = z1 + (int)pow(2, int(s1.length() - 1 - i)   );
    }
    return z1;
}

std::string intToBin(int value)
{// перевод в двоичное

    std::string bufer; 
    if(!value) { bufer.push_back('0'); return bufer; }

    while(value)
    {
        bufer.push_back(char(value % 2 + '0'));
        value /= 2;
    }

    std::reverse(bufer.begin(), bufer.end());
    return bufer;
}

std::string bin_sum(const std::string &s1,  const std::string &s2)
{
    return intToBin(binToint(s1) + binToint(s2));
}

std::string bin_minus(const std::string &s1,  const std::string &s2)
{
    return intToBin(binToint(s1) - binToint(s2) );
}
std::string bin_mult(const std::string &s1,  const std::string &s2)
{
    return intToBin(binToint(s1) * binToint(s2));
}

std::string bin_div(const std::string &s1,  const std::string &s2)
{
    int z = binToint(s2); 
    if(!z) throw std::runtime_error("divide by zero") ;
    return intToBin(binToint(s1) / z );
}

};

int main()
{
    std::string s1("101");
    std::string s2("011");
    

    try
    {
        std::cout << BIN_OPERATIONS::bin_sum(s1, s2) << std::endl;
        
        std::cout << BIN_OPERATIONS::bin_minus(s1, s2) << std::endl;
        
        std::cout << BIN_OPERATIONS::bin_mult(s1, s2) << std::endl;
        
        std::cout << BIN_OPERATIONS::bin_div(s1, s2) << std::endl;

    }
    catch(const std::runtime_error &e)
    {
        std::cout << e.what();
    }
    return 0;
}



Автор: PPS05 13.2.2008, 23:51
Взято с rsdn.ru:

Код

#define BIN8(x) BIN___(0##x)
#define BIN___(x)                                        \
    (                                                \
    ((x / 01ul) % 010)*(2>>1) +                      \
    ((x / 010ul) % 010)*(2<<0) +                     \
    ((x / 0100ul) % 010)*(2<<1) +                    \
    ((x / 01000ul) % 010)*(2<<2) +                   \
    ((x / 010000ul) % 010)*(2<<3) +                  \
    ((x / 0100000ul) % 010)*(2<<4) +                 \
    ((x / 01000000ul) % 010)*(2<<5) +                \
    ((x / 010000000ul) % 010)*(2<<6)                 \
    )

#define BIN16(x1,x2) \
    ((BIN(x1)<<8)+BIN(x2))

#define BIN24(x1,x2,x3) \
    ((BIN(x1)<<16)+(BIN(x2)<<8)+BIN(x3))

#define BIN32(x1,x2,x3,x4) \
    ((BIN(x1)<<24)+(BIN(x2)<<16)+(BIN(x3)<<8)+BIN(x4))

#define BIN64(x1,x2,x3,x4,x5,x6,x7,x8) \
    ((__int64(BIN32(x1,x2,x3,x4)) << 32) + __int64(BIN32(x5,x6,x7,x8)))

...

char  i1 = BIN8 (101010);
short i2 = BIN16(10110110,11101110);
long  i3 = BIN24(10110111,00010111,01000110);
long  i4 = BIN32(11101101,01101000,01010010,10111100);

Автор: new_web 14.2.2008, 00:13
Fazil6, Спасибо, Ваш пример понятен, попробую его приделать к своим нуждам!


PPS05,  к сожалению, мне пока многое непонятно(((

Плохо, что компилятор не понимает двоичный код, может, на  asm заплатку сделать, он понимает двичныый код, жаль. я асма не понимаю...

Автор: bsa 14.2.2008, 11:44
Цитата(new_web @ 14.2.2008,  00:13)
PPS05,  к сожалению, мне пока многое непонятно(((

Плохо, что компилятор не понимает двоичный код, может, на  asm заплатку сделать, он понимает двичныый код, жаль. я асма не понимаю...

А чего тут непонятного? Он написал макрос, который из "двоичного" числа, делает "10-е", попутно преобразовывая его в восьмиричное (0##x - дописывание 0 перед значением x).
* - умножение
/ - деление
% - остаток от деления
>> - двоичный сдвиг вправо на n бит (считай деление на 2 в степени n)
Что непонятного?

Автор: jonie 14.2.2008, 15:03
имхо один фиг не ответ на вопрос) просили компилятор как заставить
как я понимаю хочется чтобы в исходниках было 001001010b и компилятор это понял бы.
или у меня проблемы с русским языком в части понимания смысла ?smile

Автор: PPS05 14.2.2008, 15:35
Цитата(jonie @  14.2.2008,  14:03 Найти цитируемый пост)
компилятор как заставить


Мой вариант и заставит компилятор.

Автор: new_web 14.2.2008, 19:23
Спасибо всем, за столь деталные ответы!
Я конечно, постараюсь в целях самообразования понять всё, да и куда я денусь?
Я очень рад, что задал этот вопрос, так как много понял из механизмов, как вообще работает компьютер.
Бинарное число мне было нужно для того. чтобы увидеть состояние регистров, точнее. чтобы их сравнить. Побродив немного в нетрях своих мозгов. я понял. что мне бинарное число и не нужно вовсе,
(но, если бы я не попробовал код Fazil6, то я бы ничего не понял))),  так как я могу работать с любым представлением числа!
Мне нужно было знать, на каком регистре получается несовпадение битов числа
Код

int х=nSomeFunc1();
int y=nSomeFunc2();
bool bRegister[n];
for(int i=0,b=1;i<n;i++,b*=2)
{
if((x&b)!=(y&b))bRegister[n]=true;//в этом регистре несовпадение!
}

Но, я бы до этого никогда не додумался. если бы Вы все мне не помогли!

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


Автор: jonie 14.2.2008, 23:39
PPS05 ну незнаю) имхо число и код вычисления что будет записан компилятором (а мож и не будет - смотря какой оптимизатор) не одно и тоже. Это предлагаю закрыть.

По теме : "что касается перевода чисел " - читай школьную информатику, тут все в 100% совпадает с ней.
перевод из любой системы в 2-ую - деление на 2, обратно - умножение 8-)

Автор: TeAnton 15.2.2008, 10:35
Советую почитать Википедию по запросам: "Система счисления", и "Позиционная система счисления".

Автор: Mayk 16.2.2008, 14:54
Цитата(jonie @  15.2.2008,  03:39 Найти цитируемый пост)
PPS05 ну незнаю) имхо число и код вычисления что будет записан компилятором (а мож и не будет - смотря какой оптимизатор) не одно и тоже.

если вместо моветонного макроса использовать шаблоны с enum'ами, то точно будет всё вычисленно в CT.

Автор: new_web 19.2.2008, 11:13
Цитата(Mayk @  16.2.2008,  14:54 Найти цитируемый пост)
если вместо моветонного макроса использовать шаблоны с enum'ами, то точно будет всё вычисленно в CT.


Мда, такой фразой можно череп раздробить smile 

Спасибо всем за советы и помощь. но всё-таки кое-чего понять не могу...

Здесь я задал вопросhttp://forum.vingrad.ru/forum/topic-194245/unread-1/anchor-entry1417608/30.html, насчёт управления портом LTP, и благодаря помощи добился своего, и сделал програмку, которая управляет портами.
http://new-web.ucoz.ua/ltp_demo.rar
Не понимаю. почему я записываю в порт Data 127, то читаю из порта 127 - а когда 128, - в порту окажется минус 128
тоесть 
128=-128;
129=-127;
...и так дальше! В чём тут проблема? я неправильно что-то не то написал в классах, или, попросту иначе не получится? 
Я пробовал всякими способами, но 127-это 127, а 128 это -128
После упорных поисков, я решил. что мне неважно, запишется там 255 или -1, так как задача была поменять напряжение на любых выводах порта Data и  Control  LTP, и задача быал решена.
Но, интересно, почему так получается, и можно ли привести это число в положительное?

Автор: Fazil6 19.2.2008, 11:32
Цитата(new_web @  19.2.2008,  10:13 Найти цитируемый пост)
Но, интересно, почему так получается, и можно ли привести это число в положительное?

скорее всего у тебя считывается в переменную типа signed char , а максимальное его значение 127, поэтому и получаешь, используй unsigned char и будут положительные значения до 255

Автор: new_web 20.2.2008, 04:39
Да! Спасибо, я почти додумался сам, я пробовал unsigned int  по незнанию..
Теперь многое прояснилось! smile  и стало работать проще!

Автор: phprus 20.2.2008, 20:40
Цитата(Mayk @  16.2.2008,  14:54 Найти цитируемый пост)
если вместо моветонного макроса использовать шаблоны с enum'ами, то точно будет всё вычисленно в CT.

Если вам не трудно, то не могли бы вы привести пример такого преобразования на шаблонах, хотябы для однобайтных констант, а то я никак не могу придумать как можно использовать шаблоны в этой задаче.

Автор: phprus 21.2.2008, 18:22
Придумал.
Вот код на шаблонах для двоичных констант и за одно шаблон для возведения целого числа в целую, положительную степень:

Код

#include <iostream>
#include <iomanip>
/******************************************************************************/
template <unsigned long n, unsigned int step = 1>
struct binconst8
{
    enum {value = (n%10)*step + binconst8<n/10,step*2>::value};
};
template <unsigned long n>
struct binconst8<n, 128>
{
    enum { value = n*128 };
};

// -----------------------------

template <unsigned long a, unsigned long b>
struct binconst16
{
    enum { value = (binconst8<a>::value << 8) + binconst8<b>::value };
};

template <unsigned long a, unsigned long b, unsigned long c>
struct binconst24
{
    enum { value = (binconst8<a>::value << 16) + (binconst8<b>::value << 8) + binconst8<c>::value };
};

template <unsigned long a, unsigned long b, unsigned long c, unsigned long d>
struct binconst32
{
    enum { value = (binconst16<a, b>::value << 16) + binconst16<c, d>::value };
};

/******************************************************************************/

template <unsigned long n, unsigned int step>
struct pow_int
{
    enum {value = (n)*pow_int<n, step-1>::value};
};
template <unsigned long n>
struct pow_int<n, 0>
{
    enum {value = 1};
};

/******************************************************************************/

int main() {

    std::cout << pow_int<10, 0>::value << std::endl;
    std::cout << pow_int<10, 1>::value << std::endl;
    std::cout << pow_int<10, 2>::value << std::endl;
    std::cout << pow_int<10, 3>::value << std::endl;

    std::cout << pow_int<2, 0>::value << std::endl;
    std::cout << pow_int<2, 1>::value << std::endl;
    std::cout << pow_int<2, 2>::value << std::endl;
// ----
    std::cout << std::endl << std::endl;
// ----
    std::cout << binconst8<0>::value << std::endl;
    std::cout << binconst8<1>::value << std::endl;
    std::cout << binconst8<10>::value << std::endl;
    std::cout << binconst8<11>::value << std::endl;
    std::cout << binconst8<100>::value << std::endl;
    std::cout << binconst8<101>::value << std::endl;
    std::cout << binconst8<110>::value << std::endl;
    std::cout << binconst8<111>::value << std::endl;
    std::cout << binconst8<1000>::value << std::endl;
    std::cout << binconst8<1001>::value << std::endl;
    std::cout << binconst8<1010>::value << std::endl;
    std::cout << binconst8<1011>::value << std::endl;
    std::cout << binconst8<1100>::value << std::endl;
    std::cout << binconst8<1101>::value << std::endl;
    std::cout << binconst8<1110>::value << std::endl;
    std::cout << binconst8<1111>::value << std::endl;
    std::cout << binconst8<11111111>::value << std::endl;
// ----
    std::cout << binconst16<10, 11>::value << std::endl;
    std::cout << binconst24<10, 11, 1>::value << std::endl;
    std::cout << binconst32<10, 11, 1, 0>::value << std::endl;
// ----

    return 0;
}

Автор: BIV 22.9.2008, 23:09
А не проще по другому?
Код

#include <stdlib.h>

short z;
char code[15];

z=5;
ltoa(z,code,2);
printf("2:  %s\n",code);


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