PDA

View Full Version : سوال: نوع داده ای میخوام که به صورت بیت به بیت کار کنم؟



rafiee.mostafa64
چهارشنبه 06 آبان 1388, 23:38 عصر
داده های ما به صورت 0و 1 هستش و برام میزان حافظه مصرفی خیلی مهمه
آیا تو c# نوع داده ای هست یا میشه تعریف کرد که به صورت بیت به بیت بهش دست پیدا کرد
توی زبان c این کار رو با تعریف استراکچر میشه انجام داد میخوام بدونم میشه مشابه این کار رو تو c# انجام داد

با تشکر از دوستان:تشویق:

rafiee.mostafa64
شنبه 09 آبان 1388, 12:28 عصر
دوستان عزیز کارم خیلی گیره لطفا یکی جواب بده:گیج:

tdkhakpur
شنبه 09 آبان 1388, 13:50 عصر
خدت هم بايد بداني خود bool هم كه كوچكترين عنص موجود هست يك بايت طول دارد شما بايد يك سري از بايتها را به عنوان حافظه در نظر بگيريد و تابعي براي بررسي بيت خاصي بنويسيد و همچنين تابعي براي ست كردن بيت خاص توابع زير براي c هست


void SetBit( void *val_, int BitNo )
{
ChrType *val; val = (ChrType*)val_;
int bNo, cNo;
cNo = (int)(BitNo/8);
bNo = (int)(BitNo%8);
switch(bNo)
{
case 0: val[cNo] |= (ChrType)1; break;
case 1: val[cNo] |= (ChrType)2; break;
case 2: val[cNo] |= (ChrType)4; break;
case 3: val[cNo] |= (ChrType)8; break;
case 4: val[cNo] |= (ChrType)16; break;
case 5: val[cNo] |= (ChrType)32; break;
case 6: val[cNo] |= (ChrType)64; break;
case 7: val[cNo] |= (ChrType)128;break;
}
}

پارامتر val همان اشاره گر سري بايتهاست و BitNo شماره بيتي از اين سري هست كه بايد فعال شود.
مثلا بيت 8 مربوط به دومين بايت از بايتهاي فوق مي باشد

JaguarXF
یک شنبه 10 آبان 1388, 01:01 صبح
توی این چهار روزی که این پست رو ایجاد کرده اید ، خودتون یا از طریق همین جا به جواب خوبی رسیدید یا نه ؟
راستش منم جواب رو بلد نبودم! گوگلش کردم . کمتر از 10 دقیقه :
جواب:

میتونید از Extension Method ها استفاده کنید : بدین صورت:}


public static class StreamExtensions
{
public static IEnumerable<bool> ReadBits(this Stream input)
{
if (input == null) throw new ArgumentNullException("input");
if (!input.CanRead) throw new ArgumentException("Cannot read from input", "input");
return ReadBitsCore(input);
}

private static IEnumerable<bool> ReadBitsCore(Stream input)
{
int readByte;
while((readByte = input.ReadByte()) >= 0)
{
for(int i = 7; i >= 0; i--)
yield return ((readByte >> i) & 1) == 1;
}
}

و سپس به اینصورت باهاش کار کنید


foreach(bool bit in stream.ReadBits())
{
// do something with the bit
}

rafiee.mostafa64
یک شنبه 10 آبان 1388, 14:47 عصر
[quote=JaguarXF;838643]توی این چهار روزی که این پست رو ایجاد کرده اید ، خودتون یا از طریق همین جا به جواب خوبی رسیدید یا نه ؟
راستش منم جواب رو بلد نبودم! گوگلش کردم . کمتر از 10 دقیقه :

با تشکر از شما:تشویق::تشویق:
آخه من تازه کارم مثل شما حرفه ای نیستم که بتونم 10 دقیقه ای به جواب برسم