Добавлен , опубликован
Внимание! Запись предназначена для тех, кто знает или изучает язык программирования C#.
Что-то давно ничего не писал на C#, а сегодня вдруг решил проверить одну свою старую идею.
Логический тип данных или bool вы, конечно, не раз использовали в коде. Ну, если не просто так зашли сюда =)
Однажды меня заинтересовала одна его особенность и я попробовал применить её, из чего и вышла эта запись.
Особенность в том, что в bool используется один бит. Конечно, в памяти, в виде одного бита он не будет храниться. Поэтому в памяти он занимает больше места.
Эти биты нигде не используются (исключение - когда 0 станет не 0 false станет true, поэтому сюрпризы приделываются только к true), поэтому на первый взгляд bool не изменится, если мы в них запишем что-нибудь. Однако в себе он будет хранить дополнительную информацию.
Перейдём к практическому решению.
Код очень простой! Но присутствует 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 можно сделать много вариантов.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
2
24
8 лет назад
2
Использование: простор для экспериментов.
Шпионские сведения вряд ли получится таким способом передать =), но кое-что скрыть можно.
А уж как можно удивить человека, вернув ему true и сказав использовать только этот, потому что это другой true. В чём он убедится через несколько вызовов ваших методов.
0
28
8 лет назад
0
открыл Америку
а то что в c++ можно писать следующий код ты не знал?
int a=5;
if(a){
// code
}
а так как c# это наследник с++ то об этом можно легко догадаться
хз, мб и в c# также можно писать
0
24
8 лет назад
Отредактирован Isstrebitel
0
В C++ знал и использовал. Но это не C++, тут типизация строже. В раннем C вроде даже bool не было, читал где-то.
А в C# не то, что неявные - даже явные преобразования int и bool не всегда разрешены.
И вообще типизация строгая и не позволяет такого. По идее. С unsafe и не такое возможно.
Насчёт наследника - не очень то он наследник. Синтаксис похож, а так ближе к Java. Ну и применение и "внутреннее устройство" C++ и C# совершенно разные. Хотя есть C++ для платформы NET, что-то среднее =)

Так что да, на C++ это обычно, но на C# такое нечасто применяют.
0
28
8 лет назад
0
Isstrebitel, c# намного ближе к c++ чем java
0
24
8 лет назад
Отредактирован Isstrebitel
0
Это да. На Википедии видел сравнение C# и Java, у C# там есть элементы C++, которых у Java нету.
Я о том, что C# близок к Java по концепции виртуальной машины. А C++ чуть-чуть отдельно, но ближе к C#, чем к Java.
0
29
8 лет назад
0
Ничего нового, да и собственно зачем это? не понятно...
А вот сделать альтернативное хранилище булов, которые реально будут использовать 1 бид это уже что-то более важное
0
24
8 лет назад
0
Ну, для подобного есть enum flags.
0
9
8 лет назад
Отредактирован AsagiriGen
0
Isstrebitel:
И туда мы пишем любое число от 0 до 255. Если оно равно 0 - false, не равно - true.
Не конкретный бит определяет значение true или false? Не верю. Что покажет при числе 4?
0
24
8 лет назад
Отредактирован Isstrebitel
0
раскрыть
GeneralElConsul, нет. В памяти в NET большинство переменных, даже маленьких, будут по 4 байта.
Но первые 3 для bool не используются, при копировании переменной они даже не копируются. А последний байт копируется. И он никуда не пропадёт.
На второе сейчас напишу.
0
29
8 лет назад
0
0
24
8 лет назад
0
GeneralElConsul, это ещё в C была такая логика - 0 - false, остальное - true. В C#, похоже, тоже, проверяет не конкретный бит, а, как в C, всё число.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.