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

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