Loading...
Losko avatar Losko 69 Точки

Salt And Pepper

//Здравейте. Опитвам се от число [0 – 18,446,744,073,709,551,615] да извадя бинарния вариант... До "long" е ОК с този код.

//long n = long.Parse(Console.ReadLine());
//string binary = Convert.ToString(n, 2).PadLeft(32, '0');
//Но "ulong" не работи.

Разбрах, че нямам достъчно знания ( побитовите операции не са ми ясни явно :( ) Но освен, тях си написах нещата. Надявам се да ми обясните тези няколко реда които ми обягват, както и защо в решеието което имам за 100/100 ( не моето за жалост ) се използва "if"
и резолтата е 100/100 в моето решение исползвам "switch" и резолтата е 90/100 :(
Това са редовте които ми обягваха и не разбирам на 100% :
if (((dishes >> j) & 1) == 1)
     {
         ulong mask = ~((ulong)1 << j);
          dishes = dishes & mask;
      }
Ето го решението за 100/100:  http://pastebin.com/EKXMjrYb
А това е моето 90/100: http://pastebin.com/6hW7RXc5

Благодаря предварително.

Тагове:
0
Общи приказки 17/06/2016 12:07:18
svetljo avatar svetljo 27 Точки

Можеш да намериш инфо по въпроса в https://stackoverflow.com/questions/6985965/is-there-a-c-sharp-function-that-formats-a-64bit-unsigned-value-to-its-equival. Ето и overloads на Convert.ToString() метода - https://msdn.microsoft.com/en-us/library/system.convert.tostring.aspx. Изглежда, че в .net не можеш директно да конвертираш ulong в binary.

Ето функцийка, която прави това:

public static string ConvertToBinary(ulong value)
{
    if (value == 0) return "0";
    System.Text.StringBuilder b = new System.Text.StringBuilder();
    while (value != 0)
    {
        b.Insert(0, ((value & 1) == 1) ? '1' : '0');
        value >>= 1;
    }
    return b.ToString();
}

 

1
17/06/2016 00:31:15
KrasimirPetkov avatar KrasimirPetkov 328 Точки

Можеш да го cast-неш към long. От гледна точка на битовете, няма разлика при представянето.

Пример:

ulong number = ulong.MaxValue; // Взимаме максималната стойност на ulong
string binary = Convert.ToString((long)number, 2); // Конвертираме го в двоична бройна система
ulong converted = Convert.ToUInt64(binary, 2); // Конвертираме двоичното число отново към ulong за проверка

Console.WriteLine(number); // Първоначалното число
Console.WriteLine(binary); // Двоично представяне
Console.WriteLine(converted); // Конвертираният към ulong string
Console.WriteLine(converted==number); // Сравняваме първоначалното и крайното число

Програмата връща:

18446744073709551615
1111111111111111111111111111111111111111111111111111111111111111
18446744073709551615
True

Надявам се информацията да ти е била от полза.

Успех!

1
17/06/2016 02:06:23
Losko avatar Losko 69 Точки

Не съм сигурен, че одговора ми помага. Най-вероятно понеже не съм задал правелният въпрос.
Цяла работа е, че сега съм на курса "Programming Basics" и то само след първата лекция :). Но решавам задачите от минал изпит. В момента се опитвам да реша задачата " Programming Basics Exam - 21 February 2016 -->> Problem 05 - Salt And Pepper.
Измислил съм някаква "програмна логика" имам структура която да ми стартира самата програма приема и разделя командите. Имам формули за манипулация на бинарния код на числото което трябва да променя. На кратко трябва да променя всеки Н-ти бит на някъква "ulong" число според зависи команда която получавам.  Та идеята ми беше да си направя числото на стринг да го манипулирам като стринг и накрая да го конвертирам в "ulong" отново. Сега като се замисля би трябвало да мога да го направя без цялата хамалогия с обръщане в бинарен код, а просто като така или иначе знам, че са 64-бита  да си направя 1 цикъл който да итерира толкова на брой пъти колкото е 64-бита / на Н-тите числа които трябва да обърна от 0 в 1 или обратното.

0
KrasimirPetkov avatar KrasimirPetkov 328 Точки

В случая начина за конвертиране от ulong към двоичен код, който показах в пост-а по-горе работи. Но идеята на тези задачи е да се решат с побитови операции. Ако искаш да опитваш с конвертиране, Convert.ToString((long)number, 2); и Convert.ToUInt64(binary, 2); работят за ulong. Ако си измислил нещо друго или си решил да се пробваш с побитови операции - супер!

И надявам се знаеш, че този тип задачи вече не се включват в приемния изпит. Ако се подготвяш за него - другите четири задачи ще са ти по-полезни. Ако ги решаваш за обща култура и знания - поздравления от мен и продължавай в същия дух!

1
Losko avatar Losko 69 Точки

Предните 4 са готови. С малко помощ от форума и лекторката ми 100/100. Иначе за жалост разбрах, че сега изпита ще е по-лесен. 
А тази задача се опитвам с побитови операции да я реша, но не искам да питам направо за одговор понеже искам да я реша до колкото мога сам само с насочващи въпроси които задавам за да си зглоя логиката на това което мъча :)

П.С. Гледах един стар лаб днес и попаднах нан ещо много полезно за тази задача.
http://www.catonmat.net/blog/low-level-bit-hacks-you-absolutely-must-know/

1
17/06/2016 02:37:49
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.