2-ая система C#
Как я понимаю num1, mun2 должны быть byte-овыми. Следовательно:
byte num1=1010;
byte num2=1000;
byte num=(byte)(num1+num2), но получается дребедень...
Как я понимаю num1, mun2 должны быть byte-овыми. Следовательно:
byte num1=1010;
byte num2=1000;
byte num=(byte)(num1+num2), но получается дребедень...
byte служит для представления двоичных чисел!!! Вот это жесть! :D
Сколько ж надо выпить, чтобы написать такое? :eek: А теперь к делу: компилятор "блюванёт" от того, что Вы написали, поскольку тип байт - это 8-битное целое без знака в диапазоне (0:255). Больше сказать нечего. Вопрос элементарный! Гугл в руки и вперёд!
У топикстартера в голове смешение понятий (байта информационного и экземпляра типа System.Byte), он еще не знает, что язык C# не позволяет задавать числовые константы напрямую в двоичной ситеме счисления. Это не VHDL. Допускаются лишь шестнадцатеричная, десятичная и восьмеричная системы счисления.
В языке C#, как и вообще в любом другом компилируемом языке арифметические операции над целыми числами происходят в процессоре, который работает исключительно в двоичной системе счисления.
Вам нужно перевести строку с вашим числом в двоичном представлении в число, понимаемое машиной - int, long, byte и дальнейшие операции производить с ним. Для вывода результата производите обратную операцию - из машинного числа выстраиваете строку с записью числа в двоичной СС.
Возникла проблема с переводом чисел в разные байтовые разряды(как в виндовском калькуляторе).
А именно с 8-мью байтами
Перевод из 10-ой системы в 2-ую, с учетом 8-ми битов(в s2 хранится число):
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-ую систему счисления такое число?
Эквивалент 8-байтного (QWORD) числа калькулятора это UInt64 (беззнаковое 64битное).
Попробуйте разобрать алгоритм:
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();
}
}
}
Не совсем могу понять, что это означает. Что такое 1UL?
Это целочисленная константа '1'. Чтобы не возникло недопонимания с компилятором в конце дописан суффикс UL что значит unsigned long - беззнаковое целое 64 битное. Также есть суффикс L - 64-битное целое со знаком.
В целом выражение устанавливает в числе result бит под номером bit. Т.е. сперва мы создаем битовую маску шириной в 64 бита с единственным поднятым битом, которую накладываем побитовым ИЛИ на result. Результат наложения сохраняется в result.
В любой СС правила сложения одинаковы. Меняется только их визуальное представление для осмысления человеком (на доске или мониторе)
Что-то не совсем понимаю алгоритм... Немоглм бы вы показать перевод из 10-ой в 8-ую и 16-ую, или хотя бы примерно объяснить какие изменения необходимо внести в коде?