Добавлен , опубликован
Внимание! Запись предназначена для тех, кто знает или изучает язык программирования 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
29
9 лет назад
0
Isstrebitel, буленовские проверки там делаются проверкой 1 флага процессора ZF (Zero Flag), который обновляется после любой арифметической операции
0
24
9 лет назад
0
alexprey, я как раз об этом. Специально проверять во многих случаях не надо.
0
29
9 лет назад
0
nvc123,
Isstrebitel, c# намного ближе к c++ чем java
Это с какой это стороны?
alexprey, подобные альтернативные хранилища уже придуманы, см. protobuf
0
24
9 лет назад
0
Doc, может быть, это проще не перечислять отличия, а привести цитату.
Кик Рэдек из Microsoft считает С# более сложным языком, чем Java[1]. По его мнению, «язык Java был построен таким образом, чтобы уберечь разработчика от стрельбы себе в ногу» (англ. «Java was built to keep a developer from shooting himself in the foot»), а «С# был построен так, чтобы дать разработчику ружьё, но оставить его на предохранителе» (англ. «C# was built to give the developer a gun but leave the safety turned on»).
В этом подход C# ближе к C++, чем подход Java.
Это моё мнение, что скажет nvc123, не знаю.
0
29
9 лет назад
0
Doc, ага слыхал про такую штуку, но она намного мощнее чем просто хранение булов)
1
29
9 лет назад
1
alexprey, естественно. Я у себя реализовывал их способ компрессии целых чисел (varint), когда можно у тебя числа 1 300 и 50000 займут в массиве не 12 байт, а 6 (вроде), on a larger scale, это очень сильно играет.
Isstrebitel, подход может и ближе, только язык от этого ближе не становится.
0
28
9 лет назад
0
Doc, в c# есть адресная арифметика
0
29
9 лет назад
0
nvc123, внезапно, в джаве она тоже есть!
0
28
9 лет назад
Отредактирован nvc123
0
Doc, пруф?
только не надо кидать тут либы работающие только на определённой ос при определённой фазе луны
если не WORA значит не java
0
29
9 лет назад
0
0
28
9 лет назад
0
Doc, он не на всех платформах работает
кроме того он не юзается в продакшене
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.