Добавлен Isstrebitel,
опубликован
Внимание! Запись предназначена для тех, кто знает или изучает язык программирования C#.
Что-то давно ничего не писал на C#, а сегодня вдруг решил проверить одну свою старую идею.
Логический тип данных или bool вы, конечно, не раз использовали в коде. Ну, если не просто так зашли сюда =)
Однажды меня заинтересовала одна его особенность и я попробовал применить её, из чего и вышла эта запись.
Особенность в том, что в bool используется один бит. Конечно, в памяти, в виде одного бита он не будет храниться. Поэтому в памяти он занимает больше места.
Эти биты нигде не используются (исключение - когда 0 станет не 0 false станет true, поэтому сюрпризы приделываются только к true), поэтому на первый взгляд bool не изменится, если мы в них запишем что-нибудь. Однако в себе он будет хранить дополнительную информацию.
Перейдём к практическому решению.
Код очень простой! Но присутствует unsafe.
Код очень простой! Но присутствует unsafe.
static bool ByteToBool(byte bt)
{
bool* p = (bool*)&bt;
bool b = *p;
return b;
//Можно было и одной строчкой, но так понятнее.
}
В этом простейшем методе мы получаем доступ к тому одному байту, в котором наше значение. Почему не int? Проверено мной, при копировании bool копируется только последний байт.
И туда мы пишем любое число от 0 до 255. Если оно равно 0 - false, не равно - true.
static byte BoolToByte(bool b)
{
byte* p = (byte*)&b;
byte bt = *p;
return bt;
}
А это - обратное действие. Мы получаем то число, которое записали. Остаётся проверить всё это на практике. Вывод написал в комментарии, как и пояснения.
static void Main(string[] args)
{
bool b = ByteToBool(111);//bool с сюрпризом
Console.WriteLine(b);//True.
if (b)
{ Console.WriteLine(b); }//True. Работает в условиях.
//Теперь попробуем скопировать значение
bool b1 = b;
byte bt = BoolToByte(b1);//111. Сохранилось.
Console.WriteLine(bt);
//И ещё любопытное.
Console.WriteLine(b1 == true);
//True. Сравнивается только последний бит.
Console.ReadLine();//Чтобы мы успели прочитать =)
}
Вот так вот.
Примечание №1.
В результате отладки выяснил, что с false такого всё-таки не выйдет - проверяется на 0 весь. Но зато true можно сделать много вариантов.
В результате отладки выяснил, что с false такого всё-таки не выйдет - проверяется на 0 весь. Но зато true можно сделать много вариантов.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Isstrebitel, подход может и ближе, только язык от этого ближе не становится.
Отредактирован nvc123
только не надо кидать тут либы работающие только на определённой ос при определённой фазе луны
если не WORA значит не java
кроме того он не юзается в продакшене