مشکل:عملگر>>(شیفت چپ)در سی شارپ

mhabat

Member
با سلام.
یک تمرین سی شارپ هست:
عدد دو رقمی xرا از ورودی بگیر و عمل زیر را بدون استفاده از عملگر ضرب انجام بده.
کد:
x=31*x-17*x+5
سورس:
کد:
x=convert.toint32(textbox1.text);
m=(x<<5)-5;
n=-((x<<4)+x);
lable2.test="y="+y.tostring();
دستور مقابل m,nرو متوجه نمی شم.

خیلی ممنون
 

the_king

مدیرکل انجمن
با سلام.
یک تمرین سی شارپ هست:
عدد دو رقمی xرا از ورودی بگیر و عمل زیر را بدون استفاده از عملگر ضرب انجام بده.
کد:
x=31*x-17*x+5
سورس:
کد:
x=convert.toint32(textbox1.text);
m=(x<<5)-5;
n=-((x<<4)+x);
lable2.test="y="+y.tostring();
دستور مقابل m,nرو متوجه نمی شم.

خیلی ممنون

عملگر shift بر اساس بیت عمل می کنه یعنی مبنای 2. اگر یک عددی یک واحد به سمت چپ shift پیدا کنه
عملا در عدد 2 ضرب میشه و اگر به سمت راست shift پیدا کنه عملا بر عدد 2 تقسیم میشه.

اگر چندین shift متوالی انجام بشه، هر shift نتیجه shift قبلی رو دو برابر می کنه، فرضا اگر x رو سه واحد به
سمت چپ shift بدهیم، مقدار x هشت برابر میشه (در 8 ضرب میشه)، یعنی 2 * 2 * 2 * x

shift همواره بر اساس توان های 2 عمل می کنه، یعنی میشه با اون مقدار x رو 2 ، 4 ، 8 ، 16، 32 و 64 و ... برابر کرد.
اگر بخواهیم مقدار x را 5 برابر کنیم، بهتر است که ابتدا 4 برابر اش کرده و سپس نتیجه را با x جمع کنیم :
کد:
(x << 2) + x

در مثال x=31*x-17*x+5 ما ابتدا x را باید در 31 ضرب کنیم، نزدیکترین توان 2 ای که به 31 نزدیک است 32 می باشد،
پس ما x را 5 واحد به سمت چپ shift خواهیم داد تا 32 برابر شود، سپس مقدار x را از نتیجه کسر می کنیم تا
31 برابر شود :
کد:
(x << 5) - x

در ادامه باید x را 17 برابر کنیم، چون 17 توان 2 نیست، ابتدا x را 16 برابر می کنیم (چهار واحد به سمت چپ
shift می دهیم) و سپس با x جمع می کنیم :
کد:
(x << 4) + x

می ماند یک 5 + که آنرا هم اضافه می کنیم، نتیجه اولیه می شود :
کد:
(x << 5) - x - ((x << 4) + x) + 5

که خلاصه اش می کنیم :
کد:
(x << 5) - x - (x << 4) - x + 5

(x << 5) - (x << 4) - x - x + 5

(x << 5) - (x << 4) - (x << 1) + 5

البته اگر صورت سوال را پیش از محاسبه خلاصه کنیم، x=14*x+5 خواهد بود و نتیجه می شود :
کد:
(x << 4) - (x << 1) + 5
 

mhabat

Member
سلام.تشکر فراوان از the_kingعزیز.

ما به این شکل نتیجه رو بدست آوردیم:
کد:
m=(x<<5)-x;
n=-((x<<4)+x);
y=m+n+5;
برای نمایش نتیجه به صورت معکور ازین فرمول استفاده می کنه(البته برای دو رقمی):
کد:
m=x%10;
n=x/10;
n=m*10+n;
آقا بنده کلا تو معکوس کردن مشکل دارم.

این تقسیمات و با قی مانده ها فرمول خاصی نداره برای معکوس اعداد ؟

یا مثلا بخوایم یک عدد رو گرفتیم بخوایم رقم دهگانشو جدا کنه و...(اگه با یه فرمول بشه همه نوع عددی رو ارقامشو جدا کرد خیلی خوبه)

پست مشابه داده بودم مثلا اون ماله 6 رقمی بود اما به دنبال یک فرمول کلی هستم که با توجه به اون بتونم برای هر تعداد رقم از عدد فرمول بنویسم.

تشکر فراوان.
 

the_king

مدیرکل انجمن
سلام.تشکر فراوان از the_kingعزیز.

ما به این شکل نتیجه رو بدست آوردیم:
کد:
m=(x<<5)-x;
n=-((x<<4)+x);
y=m+n+5;
برای نمایش نتیجه به صورت معکور ازین فرمول استفاده می کنه(البته برای دو رقمی):
کد:
m=x%10;
n=x/10;
n=m*10+n;
آقا بنده کلا تو معکوس کردن مشکل دارم.

این تقسیمات و با قی مانده ها فرمول خاصی نداره برای معکوس اعداد ؟

یا مثلا بخوایم یک عدد رو گرفتیم بخوایم رقم دهگانشو جدا کنه و...(اگه با یه فرمول بشه همه نوع عددی رو ارقامشو جدا کرد خیلی خوبه)

پست مشابه داده بودم مثلا اون ماله 6 رقمی بود اما به دنبال یک فرمول کلی هستم که با توجه به اون بتونم برای هر تعداد رقم از عدد فرمول بنویسم.

تشکر فراوان.

جدا کردن ارقام چه معکوس و چه غیر معکوس فرقی نمی کنه، اول مبنای عدد رو مشخص می کنید، فرضا مبنای 10

اولین رقم سمت راست :
اگر باقیمانده تقسیم عدد x رو بر 10 بدست بیاورید اولین رقم سمت راست اش خواهد بود، یعنی وقتی m=x%10
را محاسبه می کنید m اولین رقم سمت راست x در مبنای 10 است. وقتی m=x%2 را محاسبه می کنید، m اولین
رقم سمت راست x در مبنای 2 است.

حذف کردن اولین رقم سمت راست :
برای حذف کردن اولین رقم سمت راست عدد در مبنای مشخصی، آنرا بر مبنای مورد نظر تقسیم می کنیم، فرضا
اگر n=x/10 محاسبه شود، n کلیه ارقام عدد x را دارد، بجز اولین رقم سمت راست در مبنای 10
حالا اگر عدد x دو رقمی باشد n رقم سمت چپی خواهد بود، اما در کل بدست آوردن اولین رقم سمت چپ فرمول
یک مرحله ای ندارد، مگر اینکه تعداد ارقام عدد دقیقا مشخص باشد.
 

جدیدترین ارسال ها

بالا