PDA

View Full Version : سوال: امکان داره تویه unsigned char ، یک عدد 8 بیتی ذخیره کرد؟



BeginnerProgrammer
دوشنبه 13 تیر 1390, 22:28 عصر
سلام
تویه یه متغیر از جنس unsigned char هشت تا صفر و 1 ذخیره کرد؟

حامد مصافی
دوشنبه 13 تیر 1390, 23:59 عصر
بله- یک char یا unsigned char در واقع یک بایت است که می‌توان 8 بیت در آن ذخیره کرد

BeginnerProgrammer
سه شنبه 14 تیر 1390, 00:08 صبح
میشه توضیح بدین چطوری یه همچین چیزی امکان پذیره؟

developing
چهارشنبه 15 تیر 1390, 12:24 عصر
با سلام

ساختارهای بیتی در C و به تبع اون در CPP هم وجود داره برای استفاده از اونها باید به شکل زیر عمل کنید:
struct mystruct
int i : 2;
unsigned j : 5;
int : 4;
int k : 1;
unsigned m : 4;

) a, b, c;

مثلا دستور بالا یک ساختار بیتی ایجاد می کنه که i یک عدد صحیح 2 بیتی هست j عدد بدون علامت 5 بیتی، 4 بیت بعدی غیر قابل دسترس هست چون نامگذاری نشده k یک عدد 1 بیتی، m یک عدد بدون علامت 4 بیتی و متغیرهای a,b,c هم از نمونه هایی از این ساختارند.

تحلیل کد بالا به این صورته که این ساختار 16 بیت از حافظه رو اشغال می کنه که به ترتیب و پشت سر هم قرار دارند و اگر آدرس شروع این ساختار رو 0 فرض کنیم بیتهای
0 و 1 برای i
2 و 3 و 4 و 5 و 6 برای j
7 و 8 و 9 و 10 غیر قابل دسترس
11 برای k
12 و 13 و 14 و 15 برای m

حالا برای استفاده باید مقادیر مناسب رو به هر کدوم از متغیرها بدیم مثلا
هر کدوم از متغیرهای عددی با علامت: از منفی 2 به توان n منهای 1 تا 2 به توان n منهای 1، منهای 1(که n همون تعداد بیت ها است) مثلا برای i که 2 بیت هست از منفی 2 به توان (1 = 1 - 2 ) تا 2 به توان (1 = 1 - 2 ) منهای 1 یعنی از 2- تا 1
متغیرهای عددی بدون علامت: از 0 تا 2 به توان n، منهای 1 (که متغیرهای کاراکتری هم یک نوع عدد هستند.)

توضیح: چون این ویرایشگر سایت برنامه نویس نتونست یک عبارت رو درست بنویسه مجبور شدم فارسی بنویسم.


نحوه استفاده هم یه چیز مثل قطعه کد زیر هست:

cout << a.i; // Print Value of i
// Value Comment

a.i = -2; // 2 True Range
a.i = -1; // -1 True Range
a.i = 0; // 0 True Range
a.i = 1; // 1 True Range


a.i = -4; // 0 Overflow Out of Range
a.i = -3; // 1 Overflow Out of Range

a.i = 2; // -2 Overflow Out of Range
a.i = 3; // -1 Overflow Out of Range

if(a.i == 1)
// Your Statement

BeginnerProgrammer
پنج شنبه 16 تیر 1390, 16:16 عصر
ولی تویه c++ من اینجوری متغیر تعریف کردم ارور داد. :(

حامد مصافی
پنج شنبه 16 تیر 1390, 16:56 عصر
در واقع من اصلا متوجه نشدم سوال شما چی هست!
هر 8 بیت مجموعا برابر با یک بایت -یا در مبنای 10 عدد 256- خواهد بود که طبیعتا این برابر با ۸ صفر یا یک است.
حال لطفا کاملا مشخص کنید منظور شما از چیست؟

BeginnerProgrammer
پنج شنبه 16 تیر 1390, 17:18 عصر
من میخوام یک استرینگ به طول 8 تا کاراکترو داخل یه متغیر Unsigned char ذخیره کنم . میدونم امکان پذیره یه تابعم نوشتم ولی دقیقا اون استرینگ رو ذخیره نمیکنه. میخوام بدونم این کار چطوری امکان پذیره:


for ( int k = 7 ; k >-1 ; k-- ) {
if ( s[k] == '1' )
x = x | 1 ;
x <<= 1 ;

}

FastCode
پنج شنبه 16 تیر 1390, 17:32 عصر
برای ذخیره رشته اول باید تشخیص بدید که کاراکتری که دارید روش کار میکنید صفر هست یا یک.
اگر ۱ بود بیت متناظرش رو در متغیر char مساوی ۱ قرار بدید.

BeginnerProgrammer
پنج شنبه 16 تیر 1390, 18:06 عصر
امکان تشخیص صفر و یک بودن کاراکترهای رشته هست ولی وقتی استرینگی با محتوایه "11001000" رو به تابع ارسال میکنم کارکتری با کد اسکی "00100110" رو میده! در حالی که تابع اینجور به نظر میرسه که دقیقا همون استرینگ رو داخل متغیر کپی میکنه!

BeginnerProgrammer
جمعه 17 تیر 1390, 19:15 عصر
این لینک خیلی برام مفید بود البته شاید ربط زیادی به این تاپیک نداشته باشه ولی تقریبا مشکل منو حل کرد در مورد نوشتن بیتی داخل فایل و خوندن بیتی از فایله!


http://michael.dipperstein.com/bitlibs