Добавлен 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 можно сделать много вариантов.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Шпионские сведения вряд ли получится таким способом передать =), но кое-что скрыть можно.
А уж как можно удивить человека, вернув ему true и сказав использовать только этот, потому что это другой true. В чём он убедится через несколько вызовов ваших методов.
а то что в c++ можно писать следующий код ты не знал?
хз, мб и в c# также можно писать
Отредактирован Isstrebitel
И вообще типизация строгая и не позволяет такого. По идее. С unsafe и не такое возможно.
Отредактирован Isstrebitel
Я о том, что C# близок к Java по концепции виртуальной машины. А C++ чуть-чуть отдельно, но ближе к C#, чем к Java.
А вот сделать альтернативное хранилище булов, которые реально будут использовать 1 бид это уже что-то более важное
Отредактирован AsagiriGen
Отредактирован Isstrebitel
Но первые 3 для bool не используются, при копировании переменной они даже не копируются. А последний байт копируется. И он никуда не пропадёт.