PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : سوال راجع به &



alamdar
23-10-2012, 11:51
سلام

من توی برنامه میکرو دیدم که داخل شرط حلفه ها یا دستور if ، معمولا دو مقدار با هم and (&) میشوند.

یکی از مقادیر به صورت یک متغیر هست و دیگری به صورت یک عدد هگزا دسیمال

مثلا :



while (!(U1LSR & 0x20));
U1THR = CR;

یا



if(ILR&0x00000001) //Test for RTC counter interrupt

{

led = IOPIN1; //read the current state of the IO pins

IOSET1 = 0x00010000; //Set the idle LED

ILR = 0x00000001; //Clear the interrupt register

}



من حدس میزنم اون اعداد هگزا دسیمال که توی مقایسه با یک متغیر دیگه and میشه ، نشانگر یک دستور باشه!
و شرط چک میکنه ببینه آیا اون متغیر با اون مقدار برابر هست یا نه؟

اما سوال که پیش میاد اینه که چرا مثلا اینطوری نوشته نمیشه :

while (!(U1LSR == 0x20));(

چرا از & استفاده میکنند؟

سوال بعد اینکه اوت اعداد هگزا دسیمال که چه توی این موارد و چه موقع معدار دهی متغیرهای محتلف استفاده میشه چی هستش؟ آیا هر کدوم نشانگر یک دستوره؟ و باید توی دیتاشیت یا usermanual میکرو دنبالش گشت یا ؟!


تازه وارد برنامه نویسی میکرو شدم و اینها برام مبهمه

esisafa
23-10-2012, 20:00
دستور a&b بیت های معادل دو مقدار رو با هم اند میکنه. اگه هر دو مقدار بیت معادل 1 باشه نتیجه اون 1 میشه و در غیر این صورت صفر. اگه نتیجه ی تمام بیتها صفر باشه مقدار نهایی صفر میشه. ولی اگه نتیجه ی یکی از بیتها 1 بشه در این صورت عدد نهایی غیر صفر خواهد بود و اونوقت دستور شرط از اون استفاده میکنه.
نتیجه ی دو روش ممکنه یکی باشه. ولی بعضی جاها اینطور نیست. مثلا نتیجه ی هر دو دستور زیر یکی هست ولی محاسبه ی اون برای یک پردازنده ی زمین تا آسمون متفاوته

a<<1
a*=2

alamdar
26-10-2012, 20:54
جالب بود مرسی

یعنی در واقع اگر دو تا عدد با هم برابر باشند حاصل & اونها برابر با خودشون میشه ...مثلا : 0x3 & 0x3 = 0x3 یا 3 میشه ، و اگر مساوی نباشند 0 میشه

esisafa
26-10-2012, 21:14
اگه دو عدد مساوی باشن درسته همون میشه ولی اگه مساوی نباشن نه صفر نمیشه. بستگی داره که بیتهای متناظرشون چطور باشه. مثلا 1&2 جوابش 0 میشه ولی 1&3 جوابش 1 میشه.

Aghaeifar
27-10-2012, 03:26
جالب بود مرسی

یعنی در واقع اگر دو تا عدد با هم برابر باشند حاصل & اونها برابر با خودشون میشه ...مثلا : 0x3 & 0x3 = 0x3 یا 3 میشه ، و اگر مساوی نباشند 0 میشه

وقتی صفر میشه که یکی از دو طرف لزوما صفر باشه.

alamdar
27-10-2012, 11:11
از نظر برنامه نویسی C این مقدار 0 میشه :



a= 0x001
b=0x100
c=a&b

=> c =0


اما اگر اینطوری بود :



a=0x100
b=0x100
c=a&b

=> c=0x100 یا c=256

shahrivar88
27-10-2012, 22:11
اصولا وقتی مقدار یک ریجسترو با همچین عددی اند میکنیم یعنی منتظریم خانه نظیر اون عدد در ریجسترمون یک بشه.

while (!(U1LSR & 0x20));

0x02=0b000000010
یعنی تا زمانی که بیت دوم ریجستر U1LSR برابر 1 است حلقه اجرا بشه و کاری به بیتهای دیگه اون ریجستر نداشته باش
فقط بیت دوم!

shahrivar88
27-10-2012, 22:15
تساوی هم درست نیست چون تغیر سایر بیتها رو نتیجه تاثیر میذاره

esisafa
28-10-2012, 00:04
بله با این دید تساوی جواب نمیده. پس میبینیم که دو تا عمل مختلف یک نتیجه میدن و بعضی جاها نه. بستگی به هدف داره