C#4位数据类型

C#4位数据类型,c#,.net,C#,.net,C#是否有4位的数据类型?我想用浪费最小内存量的变量编制一个程序,因为该程序会消耗大量内存 例如:我需要保存一个值,我知道它将从0变为10,而4位var可以从0变为15,这是完美的。但我找到的最接近的数据类型是8位(1字节)数据类型Byte 我的想法是创建一个带有自定义数据类型的c++dll。类似于啃咬的东西。但是,如果这是我问题的解决方案,我不知道从哪里开始,我必须做什么 限制:创建一个字节并将其一分为二不是一个选项。不,c#中没有四位数据类型 顺便说一句,四位只能存储0到15之间的数字,所以

C#是否有4位的数据类型?我想用浪费最小内存量的变量编制一个程序,因为该程序会消耗大量内存

例如:我需要保存一个值,我知道它将从
0
变为
10
,而4位var可以从
0
变为
15
,这是完美的。但我找到的最接近的数据类型是8位(1字节)数据类型Byte

我的想法是创建一个带有自定义数据类型的c++dll。类似于啃咬的东西。但是,如果这是我问题的解决方案,我不知道从哪里开始,我必须做什么


限制:创建一个字节并将其一分为二不是一个选项。

不,c#中没有四位数据类型

顺便说一句,四位只能存储0到15之间的数字,所以如果您存储的是0到127之间的值,这听起来似乎不适合使用。若要计算具有N位的变量的范围,请使用公式
(2^N)-1
计算最大值。2^4=16-1=15

如果需要使用小于8位的数据类型以节省空间,则需要使用和特殊代码来访问它

例如,您可以使用AND掩码和位移位在一个字节中存储两个四位值,例如

byte source = 0xAD;
var hiNybble = (source & 0xF0) >> 4; //Left hand nybble = A
var loNyblle = (source & 0x0F);      //Right hand nybble = D
或者使用整数除法和模,这也很好,但可能不太可读:

var hiNybble = source / 16;
var loNybble = source % 16;
当然,您可以使用扩展方法

static byte GetLowNybble(this byte input)
{
    return input % 16;
}

static byte GetHighNybble(this byte input)
{
    return input / 16;
}

var hiNybble = source.GetHighNybble();
var loNybble = source.GetLowNybble();
存储它更容易:

var source = hiNybble * 16 + lowNybble;
只更新一个nybble更难:

var source = source & 0xF0 + loNybble;        //Update only low four bits
var source = source & 0x0F + (hiNybble << 4); //Update only high bits
var source=source&0xF0+lonyble//仅更新低位四位

var source=source&0x0F+(hinyble4位数据类型(又称Nib)仅从0-15开始。从0-127开始需要7位。您基本上需要一个字节。

否,C#没有4位数字数据类型。如果您希望在一个8位字节中打包2个4位值,则需要自己编写打包和解包代码。

否,即使布尔值也是8位大小


您可以使用
>
,这取决于您需要处理的半字节数量以及性能问题中有多少是由于内存使用而引起的,您可能需要查看和类。但是,要传递值,您仍然需要更大的类型


还有另一种选择可能是摆弄,……不过要小心龙。

最小的可寻址空间是一个字节,所以不,你不能有半字节的变量。你会有很多开销。如果你担心有这么多的4位值会耗尽内存,那么你可能是试图用错误的方法解决这个问题。什么是“消费很多"?2 GB?4 GB?64 GB?不管你在看什么,你可能想得太早了,或者解决问题的方式不对。为什么会有否决票?我只是想知道一些我不知道的事情…是的,对不起,我是说0到10。现在解决问题如果你只需要0-10,你可以在一个字节中压缩2个字节。但老实说,所有这些都是不好的做法管理环境中的CE。你应该真正考虑你要完成的任务。在托管环境中编程实际上更关心抽象和解耦与实现硬件。如果你在C++中寻找答案,它对我来说更为合理。@ VoTeCfFuff[Cord> >限制:创建一个字节和SPLITTIN。g将其一分为二不是一个选项。
您可能需要创建一个帮助器类来将您的工作整理成非托管代码。如果您尝试使用布尔值滚动自己的半字节,那么您将使用更多的内存空间。即使在非托管环境中,内存也是在字节级别寻址的,因此您必须创建查找半字节的函数s、 这将是一个很大的工作。
StructLayout
将不允许您以字节的小数部分来布局字段。最多您可以做一些愚蠢的事情,比如覆盖两个16位整数。的确。我的不好。谢谢您指出这一点。