NOTICE توجه: این یک موضوع قدیمی است که آخرین پست ارسالی آن مربوط به 4201 روز قبل است . لطفا فقط پاسخ ها ، سوالات و درخواست های 100 درصد مرتبط را به آن ارسال کنید و برای درخواست ها و سوالات جدید موضوع جدیدی را ایجاد کنید
نمایش نتایج: از 1 به 9 از 9

موضوع: سوال راجع به &

  1. #1
    کاربر دائمی
    تاریخ عضویت
    Nov 2011
    نوشته ها
    427
    تشکر
    218
    تشکر شده 128 بار در 102 پست

    Exclamation سوال راجع به &

    سلام

    من توی برنامه میکرو دیدم که داخل شرط حلفه ها یا دستور 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 میکرو دنبالش گشت یا ؟!


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

  2. # ADS
    Circuit advertisement
    تاریخ عضویت
    Always
    نوشته ها
    Many
     

  3. #2
    مدیرکل انجمنها
    تاریخ عضویت
    May 2011
    نام
    احسان صفامنش
    نوشته ها
    1,763
    تشکر
    919
    تشکر شده 2,261 بار در 1,056 پست

    پیش فرض

    دستور a&b بیت های معادل دو مقدار رو با هم اند میکنه. اگه هر دو مقدار بیت معادل 1 باشه نتیجه اون 1 میشه و در غیر این صورت صفر. اگه نتیجه ی تمام بیتها صفر باشه مقدار نهایی صفر میشه. ولی اگه نتیجه ی یکی از بیتها 1 بشه در این صورت عدد نهایی غیر صفر خواهد بود و اونوقت دستور شرط از اون استفاده میکنه.
    نتیجه ی دو روش ممکنه یکی باشه. ولی بعضی جاها اینطور نیست. مثلا نتیجه ی هر دو دستور زیر یکی هست ولی محاسبه ی اون برای یک پردازنده ی زمین تا آسمون متفاوته
    [PHP]a<<1
    a*=2[/PHP]

  4. کاربران : 2 تشکر کرده اند از شما esisafa برای ارسال این پست سودمند:


  5. #3
    کاربر دائمی
    تاریخ عضویت
    Nov 2011
    نوشته ها
    427
    تشکر
    218
    تشکر شده 128 بار در 102 پست

    پیش فرض

    جالب بود مرسی

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

  6. #4
    مدیرکل انجمنها
    تاریخ عضویت
    May 2011
    نام
    احسان صفامنش
    نوشته ها
    1,763
    تشکر
    919
    تشکر شده 2,261 بار در 1,056 پست

    پیش فرض

    اگه دو عدد مساوی باشن درسته همون میشه ولی اگه مساوی نباشن نه صفر نمیشه. بستگی داره که بیتهای متناظرشون چطور باشه. مثلا 1&2 جوابش 0 میشه ولی 1&3 جوابش 1 میشه.

  7. #5
    مدیر انجمن Aghaeifar آواتار ها
    تاریخ عضویت
    Feb 2010
    نام
    علی آقائی فر
    نوشته ها
    751
    تشکر
    552
    تشکر شده 975 بار در 440 پست

    پیش فرض

    نقل قول نوشته اصلی توسط alamdar نمایش پست ها
    جالب بود مرسی

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

    اللهم عجل لولیک الفرج

  8. #6
    کاربر دائمی
    تاریخ عضویت
    Nov 2011
    نوشته ها
    427
    تشکر
    218
    تشکر شده 128 بار در 102 پست

    پیش فرض

    از نظر برنامه نویسی C این مقدار 0 میشه :

    کد:
    a= 0x001
    b=0x100
    c=a&b
    
    => c =0
    اما اگر اینطوری بود :

    کد:
    a=0x100
    b=0x100
    c=a&b
    
    => c=0x100  یا   c=256

  9. #7
    کاربر فعال shahrivar88 آواتار ها
    تاریخ عضویت
    Jul 2011
    نام
    امیر عزیزی
    نوشته ها
    243
    تشکر
    173
    تشکر شده 201 بار در 109 پست

    پیش فرض

    اصولا وقتی مقدار یک ریجسترو با همچین عددی اند میکنیم یعنی منتظریم خانه نظیر اون عدد در ریجسترمون یک بشه.

    while (!(U1LSR & 0x20));

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

  10. #8
    کاربر فعال shahrivar88 آواتار ها
    تاریخ عضویت
    Jul 2011
    نام
    امیر عزیزی
    نوشته ها
    243
    تشکر
    173
    تشکر شده 201 بار در 109 پست

    پیش فرض

    تساوی هم درست نیست چون تغیر سایر بیتها رو نتیجه تاثیر میذاره

  11. تشکرها از این نوشته :


  12. #9
    مدیرکل انجمنها
    تاریخ عضویت
    May 2011
    نام
    احسان صفامنش
    نوشته ها
    1,763
    تشکر
    919
    تشکر شده 2,261 بار در 1,056 پست

    پیش فرض

    بله با این دید تساوی جواب نمیده. پس میبینیم که دو تا عمل مختلف یک نتیجه میدن و بعضی جاها نه. بستگی به هدف داره

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •