Добавлен , опубликован
Внимание! Запись предназначена для тех, кто знает или изучает язык программирования 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 можно сделать много вариантов.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
28
Doc, пруф?
только не надо кидать тут либы работающие только на определённой ос при определённой фазе луны
если не WORA значит не java
28
Doc, он не на всех платформах работает
кроме того он не юзается в продакшене
9
Что касается того, с чем приходиться работать программисту, С# и Java как 2 брата-близнеца.
24
Doc, nvc123, даже более того, есть далеко идущие планы по поводу этой штуки - половина о том, как её уничтожить в 9 джаве и половина о том, как помешать уничтожению приведя в приличный вид.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.