Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

2-ая система C#

46K
04 апреля 2009 года
Anuf
7 / / 04.04.2009
Допустим есть num1, num2 в них занесены числа в виде двоичной системе исчисления, как сделать так, что бы операции + - * / работали с этими числами, придержвиаясь правил двоичной системы.
Как я понимаю num1, mun2 должны быть byte-овыми. Следовательно:
byte num1=1010;
byte num2=1000;
byte num=(byte)(num1+num2), но получается дребедень...
397
04 апреля 2009 года
SergPas
527 / / 03.02.2007
Цитата: Anuf
Допустим есть num1, num2 в них занесены числа в виде двоичной системе исчисления, как сделать так, что бы операции + - * / работали с этими числами, придержвиаясь правил двоичной системы.
Как я понимаю num1, mun2 должны быть byte-овыми. Следовательно:
byte num1=1010;
byte num2=1000;
byte num=(byte)(num1+num2), но получается дребедень...


byte служит для представления двоичных чисел!!! Вот это жесть! :D
Сколько ж надо выпить, чтобы написать такое? :eek: А теперь к делу: компилятор "блюванёт" от того, что Вы написали, поскольку тип байт - это 8-битное целое без знака в диапазоне (0:255). Больше сказать нечего. Вопрос элементарный! Гугл в руки и вперёд!

5
05 апреля 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: SergPas
byte служит для представления двоичных чисел!!! Вот это жесть! :D

У топикстартера в голове смешение понятий (байта информационного и экземпляра типа System.Byte), он еще не знает, что язык C# не позволяет задавать числовые константы напрямую в двоичной ситеме счисления. Это не VHDL. Допускаются лишь шестнадцатеричная, десятичная и восьмеричная системы счисления.

46K
05 апреля 2009 года
Anuf
7 / / 04.04.2009
Получается в C# нету метода для произведений арифметических операций над разными системами счисления(или же это относится только к 2-ой систему) и делать все придется вручную, просматрвиая строку, в которой записано число?
5
05 апреля 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: Anuf
Получается в C# нету метода для произведений арифметических операций над разными системами счисления(или же это относится только к 2-ой систему) и делать все придется вручную, просматрвиая строку, в которой записано число?

В языке C#, как и вообще в любом другом компилируемом языке арифметические операции над целыми числами происходят в процессоре, который работает исключительно в двоичной системе счисления.

Вам нужно перевести строку с вашим числом в двоичном представлении в число, понимаемое машиной - int, long, byte и дальнейшие операции производить с ним. Для вывода результата производите обратную операцию - из машинного числа выстраиваете строку с записью числа в двоичной СС.

46K
05 апреля 2009 года
Anuf
7 / / 04.04.2009
Ну переведу строку в int, но что дальше? Какую операцию произвести, что бы, например, сложилось оно с другим числом по "законам" двоичной системы, а не десятичной.
46K
20 апреля 2009 года
Anuf
7 / / 04.04.2009
Есть еще один вопрос...
Возникла проблема с переводом чисел в разные байтовые разряды(как в виндовском калькуляторе).
А именно с 8-мью байтами
Перевод из 10-ой системы в 2-ую, с учетом 8-ми битов(в s2 хранится число):
 
Код:
double max = Int64.MaxValue;
                if (num > (max * 2 + 1))
                {
                    double count = Math.Truncate(num / (max * 2 + 1));
                    num = num - (count * (max * 2 + 1)) - 1 * count;
                }
                s2 = Convert.ToDecimal(num).ToString();
                s2 = Convert.ToString(Int64.Parse(s2), 2);


В windows калькуляторе в 8-ми байтах может содержатся 18446744073709551615, в Int64 максимальная величина в 2 раза меньше. И соответственно если в момент преобразования в s2 будет записанно число выше Int64 то выйдет ошибка переполнения. Как же перевести в 2-ую систему счисления такое число?
5
20 апреля 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: Anuf
Как же перевести в 2-ую систему счисления такое число?


Эквивалент 8-байтного (QWORD) числа калькулятора это UInt64 (беззнаковое 64битное).

Попробуйте разобрать алгоритм:

Код:
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;

namespace ConsoleApplication2 {
    class Program {

        static ulong ParseBinaryNumber(string str) {
            ulong result = 0;
            for (int i = str.Length - 1, bit = 0; i >= 0; --i, ++bit) {
                switch (str) {
                    case '0':
                        break;
                    case '1':
                        result |= (1UL << bit);
                        break;
                    default:
                        throw new FormatException("Некоректная строка!");
                }
            }
            return result;
        }

        static string ToBinaryNumberString(ulong value) {
            int bit_count = sizeof(ulong) * 8;
            StringBuilder sb = new StringBuilder(bit_count);
            for (int bit = bit_count - 1; bit >= 0; --bit) {
                switch ((value >> bit) & 1UL) {
                    case 0:
                        sb.Append('0');
                        break;
                    case 1:
                        sb.Append('1');
                        break;
                }
            }
            return sb.ToString();
        }

        static void Main(string[] args) {
            ulong number = ParseBinaryNumber("1100011001000101000010010010111001010010011000011001110011000110"); //14286835487458041030
            Trace.Assert(number == 14286835487458041030UL);
            Console.WriteLine(number);
            Console.WriteLine(ToBinaryNumberString(number));

            Console.ReadLine();

        }
    }
}
46K
20 апреля 2009 года
Anuf
7 / / 04.04.2009
 
Код:
result |= (1UL << bit);

Не совсем могу понять, что это означает. Что такое 1UL?
5
21 апреля 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: Anuf
Что такое 1UL?


Это целочисленная константа '1'. Чтобы не возникло недопонимания с компилятором в конце дописан суффикс UL что значит unsigned long - беззнаковое целое 64 битное. Также есть суффикс L - 64-битное целое со знаком.

Цитата: Anuf
 
Код:
result |= (1UL << bit);
Не совсем могу понять, что это означает.

В целом выражение устанавливает в числе result бит под номером bit. Т.е. сперва мы создаем битовую маску шириной в 64 бита с единственным поднятым битом, которую накладываем побитовым ИЛИ на result. Результат наложения сохраняется в result.

14
21 апреля 2009 года
Phodopus
3.3K / / 19.06.2008
Цитата: Anuf
Ну переведу строку в int, но что дальше? Какую операцию произвести, что бы, например, сложилось оно с другим числом по "законам" двоичной системы, а не десятичной.


В любой СС правила сложения одинаковы. Меняется только их визуальное представление для осмысления человеком (на доске или мониторе)

46K
21 апреля 2009 года
Anuf
7 / / 04.04.2009
hardcase
Что-то не совсем понимаю алгоритм... Немоглм бы вы показать перевод из 10-ой в 8-ую и 16-ую, или хотя бы примерно объяснить какие изменения необходимо внести в коде?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог