PDA

View Full Version : سوال: عملگرهای بیتی



admiral-s
دوشنبه 18 اردیبهشت 1391, 19:03 عصر
عملگرهای بیتی در c



سلام.
میشه یکی شیفت به چپ و شیفت به راست رو با مثال برام توضیح بده ؟؟
ممنون.

Mahmood_M
دوشنبه 18 اردیبهشت 1391, 21:58 عصر
8 بیت مقابل رو در نظر بگیرید : 10001001
اگر عدد بالا رو شیفت به چپ کنید ، بیتهای با مقدار 1 ، یک واحد به چپ میرن : 00010010
اگر عدد بالا رو شیفت به راست کنید ، بیتهای با مقدار 1 ، یک واحد به راست میرن : 01000100
به مقادیر 1 که در ابتدا و انتها هستند دقت کنید ، اگر مقدار 1 در بیت هشتم ( از راست به چپ ) باشه و شیفت به راست انجام بشه ، اون مقدار یک به بیت هفتم انتقال پیدا میکنه و مقدار بیت هشتم 0 میشه
اگر مقدار 1 در بیت اول باشه و شیفت به چپ کنید ، مقدار 1 مربوط به بیت اول ، در عدد حاصل به بیت دوم اختصاص داده میشه و در بیت اول مقدار 0 قرار می گیره

شیفت به راست :
http://mahmoodn.persiangig.com/image/Weblog/Shift_Right.png
شیفت به چپ :
http://mahmoodn.persiangig.com/image/Weblog/Shift_Left.png

چند مثال :


10110010 shr ( >> ) = 01011001
10110010 shl ( << ) = 01100100

11010011 shr ( >> ) = 01101001
11010011 shl ( << ) = 10100110


موفق باشید ...

esmael_g
جمعه 07 فروردین 1394, 12:01 عصر
با سلام دوستان کسی این رو بلده یه توضیح کوچیک به من بدین
مقدار دهی x مقدار دهی دودویی unsingned char x
7 00000111 7=x
14 00001110 1>> x = x
112 01110000 3>> x = x
192 11000000 2>> x = x
96 01100000 1<< x = x
24 00011000 2<< x = x

در این مسئله از 7تا 112هر شیفت که به چپ شده هر شیفت ضرب در 2شده است این تو کتاب اومده
یعنی در اولی یک شیفت اضافه شده که شده 7*2=14 و بعد 3تا اضافه شده که با 1اولی شد چهار تا که در دو ضرب شده و شده 8تا
8*14=112 الان 192بدست نمی یاد طبق گفته کتاب ضرب در دو بشه
و بعد که 192 شیفت از راست اضافه می شه و هر شیفت هم تقسیم به عمل می یاد و 192تقسیم بر دو میشه میشه 96و 96هم تقسیم بر 4میشه 24البته فقط 3تا کلا اضافه می شه که در اینجا به عنوان 4تا نشون داده می شه کی میدونه این چطوری لطفا توضیح بدید؟

reza_noei
جمعه 07 فروردین 1394, 14:55 عصر
با سلام دوستان کسی این رو بلده یه توضیح کوچیک به من بدین
مقدار دهی x مقدار دهی دودویی unsingned char x
7 00000111 7=x
14 00001110 1>> x = x
112 01110000 3>> x = x
192 11000000 2>> x = x
96 01100000 1<< x = x
24 00011000 2<< x = x

در این مسئله از 7تا 112هر شیفت که به چپ شده هر شیفت ضرب در 2شده است این تو کتاب اومده
یعنی در اولی یک شیفت اضافه شده که شده 7*2=14 و بعد 3تا اضافه شده که با 1اولی شد چهار تا که در دو ضرب شده و شده 8تا
8*14=112 الان 192بدست نمی یاد طبق گفته کتاب ضرب در دو بشه
و بعد که 192 شیفت از راست اضافه می شه و هر شیفت هم تقسیم به عمل می یاد و 192تقسیم بر دو میشه میشه 96و 96هم تقسیم بر 4میشه 24البته فقط 3تا کلا اضافه می شه که در اینجا به عنوان 4تا نشون داده می شه کی میدونه این چطوری لطفا توضیح بدید؟

سلام.
اگر یک عدد رو سه بار شیفت به چپ بدهیم انگار اون عدد رو در 2 بتوان 3 ضرب کرده ایم. حال تو خط سوم 112 از ضرب 14 در (2 بتوان 3) 8 حاصل شده. مرحله بعدی 112 رو دوبار شیفت داده که انگار در 2 بتوان 2 ( یا 4)‌ضرب شده که حاصل میشه 448 چون یکی از بیتهامون در بازه عدد جای نمیگیره سر ریز میکنه (یعنی کنار گذاشته میشه)‌ باقیمانده بیت ها عدد 192 رو تشکیل میدن.

esmael_g
جمعه 07 فروردین 1394, 18:55 عصر
دوباره سلام ممنون از پاسخ گفتید که (حاصل میشه 448 چون یکی از بیتهامون در بازه عدد جای نمیگیره سر ریز میکنه (یعنی کنار گذاشته میشه)‌ باقیمانده بیت ها عدد 192 رو تشکیل میدن.)
الان فکر کنید این در مواقعی دیگه و مواردی دیگه هست بگید من چطوری حساب کنم که مثلا این 448که شده 192 چطوری حساب میشه ممنون میشم کمک کنید
باز ممنون

reza_noei
جمعه 07 فروردین 1394, 23:03 عصر
دوباره سلام ممنون از پاسخ گفتید که (حاصل میشه 448 چون یکی از بیتهامون در بازه عدد جای نمیگیره سر ریز میکنه (یعنی کنار گذاشته میشه)‌ باقیمانده بیت ها عدد 192 رو تشکیل میدن.)
الان فکر کنید این در مواقعی دیگه و مواردی دیگه هست بگید من چطوری حساب کنم که مثلا این 448که شده 192 چطوری حساب میشه ممنون میشم کمک کنید
باز ممنون

سلام
تو این مثال 8 بیت داشتیم یعنی میتونستیم عددی در بازه 0 تا 255 رو در اون ذخیره کنیم. پس حداکثر مقدار ما 255 میشه.
ساده ترین راه کار اینه که هر زمانی عدد حاصله از حداکثر بیشتر شد از اون عدد مقدار (حداکثر +1) رو کم کنید. (حالا هر چند بیت که داشته باشیم)
مثلا 448 میشه 256 - 448 که 192 خواهد شد.
ولی بعنوان یک برنامه نویس زبان سی بهتره که بیشتر با بیت ها بازی کنید تا مهارت پیدا کنید.