Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по переводу типа ulong в двоичный вид 
:(
    Опции темы
MaratGalimov
Дата 5.8.2014, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 3.5.2014

Репутация: нет
Всего: нет



Доброго времени суток. Не ругайтесь, если спрошу что-то глупое. Просто у меня основной упор на электронику и разработку устройств.

Есть целевое устройство под задачу. Необходимо было написать новое ПО для ПК под новые задачи.
Решил сам быстро написать на C# и .Net. Мне надо было преобразовать данные типа ulong в двоичный вид. Ну вспомнил как в школе заставляли еще на Pascal писать подпрограмму, которая раскладывала десятичное число, а потом надо было собрать его в виде 1 и 0, как набор переменных типа символ.

Ну грубо говоря и сейчас мне нужно двоичное представление числа, как строка с символами. Она уже отправляется на устройство.

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

Код

long number = 8;
Console.WriteLine(Convert.ToString(number, 2));

Console.ReadKey();


Проверил, работает.

Но вот у меня мои числа в в вычислениях ulong. А на ulong не работает. Т.е. при
Код

ulong number = 8;
Console.WriteLine(Convert.ToString(number, 2));

Console.ReadKey();


Студия 2012 выдает мне ошибки:

Error 1 - The best overloaded method match for 'System.Convert.ToString(object, System.IFormatProvider)' has some invalid arguments

Error 2 - Argument 2: cannot convert from 'int' to 'System.IFormatProvider'


В итоге поменял все переменные с числами на long вместо ulong - программа работает. Но вот потом на дальнейших этапах разработки вылезли грабли, что я не вписываюсь в интервал long:

long - signed - with range
from -922337203685477508 to 922337203685477507


Мне необходим именно тип ulong, с интервалом:

ulong - unsigned - with range
from 0 to 18446744073709551615


Собственно вопрос: Как сделать из числа типа ulong его двоичное представлением в виде типа string с последовательностью 0 и 1 (как символы) штатными средствами.

Нужен именно string, так как устройство обрабатывает входные данные как символы.

Всем заранее спасибо за любую помощь.

PM MAIL   Вверх
jonie
Дата 5.8.2014, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



ну хотя бы так пойдёт?
Код

            ulong n = 922337203685477507UL;
            string b = "";
            while (n != 0)
            {
                ulong nextDigit = n & 0x01;
                b = nextDigit + b;
                n = n >> 1;
            }


вообще при чем тут C#, если этому учат на уроках информатики в школе?


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
MaratGalimov
Дата 8.8.2014, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 3.5.2014

Репутация: нет
Всего: нет



to jonie

Спасибо за помощь.

Цитата

вообще при чем тут C#, если этому учат на уроках информатики в школе?


Когда у меня не получилось перевести десятичное число (ulong number;) в двоичное в виде string с помощью:
Код

Console.WriteLine(Convert.ToString(number, 2));

Я открыл свой старый "олдскульный" учебник по информатике (еще со школы валялся, весь выцвевший), нашел там главу, где десятичные числа переводили в двоичные делением столбиком (алгоритм замещения), собирая остатки от деления (0 и 1) от младшего к старшему разряду.

"В лоб" написал программу по алгоритму из учебника информатики, и стал пользоваться пока таким вариантом:
Код

            ulong number = 170;
            
            ulong chastnoe = 0; // неполное частное
            ulong ostatok = 0; // остаток от деления
            ulong delimoe = 0; // новое делимое

            string stroka = "";

            delimoe = number;

            chastnoe = delimoe / 2;
            ostatok = delimoe - chastnoe * 2;
            stroka = ostatok + stroka;
            // записываем младший разряд двоичного числа

            while (chastnoe != 0)
            {
                delimoe = chastnoe; // если ЧАСТНОЕ не равно нулю, то принимаем его за новое ДЕЛИМОЕ
                chastnoe = delimoe / 2;
                ostatok = delimoe - chastnoe * 2;
                stroka = ostatok + stroka; // записываем разряды от младшего к старшему
                
            } 
            
            Console.WriteLine(stroka);

            Console.ReadKey();


Но ваш код однозначно более изящен, т.к. меньше и приятнее глазу для чтения!!!

Прошу прощения, что не верно выразил вопрос.

Собственно вопрос у меня был:
Можно ли именно с помощью "Console.WriteLine(Convert.ToString(number, 2));" перевести ulong в двоичный string, не получая при этом два Error'а.

Или на ulong  "Console.WriteLine(Convert.ToString(number, 2));" работать не будет в принципе.

Если работать не будет, то почему так (буду благодарен за информацию).


Заранее спасибо.
PM MAIL   Вверх
mihryak
Дата 8.8.2014, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



jonie, а если n == 0?
PM MAIL ICQ   Вверх
MaratGalimov
Дата 1.10.2014, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 3.5.2014

Репутация: нет
Всего: нет



Спасибо всем за помощь. Вопрос темы закрыт (как впрочем и тема).

Поговорил с множеством Шарпистов и Дотнетчиков - все сказали:
На ulong  "Console.WriteLine(Convert.ToString(number, 2));" работать не будет.

Хотелось бы подытожить тему двумя методами (из предыдущих ответов):

Перевод целого десятичного числа в двоичное (вариант jonie, с добавлением проверки на ноль)
Код

public string DECIMAL_TO_BINARY_CONVERTER_1(ulong input_decimal_number)
{
 
    string output_binary_number;
 
    string accumulator_string = ""; // строка накопитель двоичных символов (от младшего к старшему разряду)
    ulong nextDigit;
 
    if (input_decimal_number == 0)
    {
        accumulator_string = "0";
    }
 
    while (input_decimal_number != 0)
    {
        nextDigit = input_decimal_number & 0x01;
        accumulator_string = nextDigit + accumulator_string;
        input_decimal_number = input_decimal_number >> 1;
    }
 
    output_binary_number = accumulator_string;
 
    return output_binary_number;
 
}


Перевод целого десятичного числа в двоичное (вариант с использованием метода замещения)
Код

public string DECIMAL_TO_BINARY_CONVERTER_2(ulong input_decimal_number)
{
 
    string output_binary_number;
 
    // Переводит десятичное число в decimal в двоичное число в string
    ulong chastnoe = 0; // неполное частное
    ulong ostatok = 0; // остаток от деления
    ulong delimoe = 0; // новое делимое
 
    string stroka = ""; // строка накопитель двоичных символов (от младшего к старшему разряду)
 
    delimoe = input_decimal_number;
 
    chastnoe = delimoe / 2;
    ostatok = delimoe - chastnoe * 2;
    stroka = ostatok + stroka;
    // записываем младший разряд двоичного числа
 
    while (chastnoe != 0)
    {
        delimoe = chastnoe; // если ЧАСТНОЕ не равно нулю, то принимаем его за новое ДЕЛИМОЕ
        chastnoe = delimoe / 2;
        ostatok = delimoe - chastnoe * 2;
        stroka = ostatok + stroka; // записываем разряды (от младшего к старшему)
    }
 
    output_binary_number = stroka;
 
    return output_binary_number;
 
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0473 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.