PDA

View Full Version : شیفت دادن



user1101
سه شنبه 11 اسفند 1388, 23:09 عصر
چرا وقتی بیت های یک عدد صحیح منفی به اندازه ی یک بیت به راست شیفت داده می شود، مقداری که از بیت ها توسط برنامه برگشت داده می شود، مثبت نمی شود؟!
مثلا مقدار عدد -5 را یک بیت به راست شیفت می دهم اما برنامه -3 را بر می گرداند

مگر یک بیت از سمت راست خارج و یک صفر از سمت چپ وارد نمی شود!؟ پس بیت علامت صفر میشود که نشان دهنده ی عدد مثبت است


void main()
{
int i;
int j;
int rshift, lshift;

while(1)//infinite loop
{
printf("\n\n\tEnter an integer for i: ");
scanf("%d", &i);
printf("\n\n\tEnter an integer for j: ");
scanf("%d", &j);

rshift = i >> j;
lshift = i << j;

printf("\n\n\trshift = %d, lshift = %d\n\n\tpress a key to continue...", rshift, lshift);
getch();
clrscr();
}
}


i یک عدد صحیح علامت دار هست که مقدارش در حافظه به اندازه ی j به راست و چپ شیفت داده می شه

amin1softco
چهارشنبه 12 اسفند 1388, 00:31 صبح
محتویات این پست اشتباه بود حذف شد

user1101
چهارشنبه 12 اسفند 1388, 01:31 صبح
در سی از سیستم متمم 1 استفاده میشه نه سیستم علامتدار یعنی

-5=~5

نه از سیستم متمم دو استفاده می شه ولی در هر صورت چه از علامت و مقدار چه متمم یک و چه متمم دو استفاده بشه، علامت عدد از با ارزشترین بیت قابل تشخیص هست و تمام اعداد مثبت دارای msb صفر و تمام اعداد منفی دارای msb یک هستن

user1101
چهارشنبه 12 اسفند 1388, 01:34 صبح
احتمالا در صورتی که متغییر علامت دار هست ، عمل شفت دادن روی بیت علامت تاثیری نمیزاره.
می شه بیشتر توضیح بدید

amin1softco
چهارشنبه 12 اسفند 1388, 12:55 عصر
درسته سی از سیستم متمم 2 استفاده می کنه من هواسم نبود اما برنامه زیر بیت علامت رو تغییر میده این حرف شما اشتباه که نمیشه بیت علامت رو تغییر داد


int a=-5;
a=(a&(~(1<<31)))
//a now equal 2147483643 is positive number

برنامه بالا 1 را در بیت 32 قرار می دهد و با اند کردن متممش بیت علامت رو تغییر میده و -5 به عدد 2147483643 تبدیل میشه

user1101
چهارشنبه 12 اسفند 1388, 14:11 عصر
ببینید منظور من اینه که وقتی شما بطور مستقیم روی یه int شیفت میدید. بیت علامت تغییر نمیکنه.
ولی نگفتم که نمیشه تغییرش داد.

الان من عدد -2147483648 که در واقع -(2^(n - 1)) برای n = 32 هست رو یک بیت به چپ شیفت دادم درست عمل کرد و مقدار1 بیت علامت رفت بیرون و همه بیت ها صفر شد و عدد صفر رو برگردوند، اما اگه به راست شیفت بدی عدد مورد انتظار رو بر نمی گردونه، عجیبه :متفکر:

user1101
چهارشنبه 12 اسفند 1388, 15:13 عصر
بعد از کلی آزمایش کردن به این نتیجه رسیدم که:
متغیر علامت داری رو که بیت علامتش منفی باشه به راست شیفت بدی بجای صفر از سمت چپ یک وارد می شه اما در مورد به چپ شیفت دادن حتی اگه بیت علامت هم تغییر کنه طبق روال عادی عمل می شه

به هر حال از نظراتتون خیلی ممنون دوستان:لبخندساده: