نمایش نتایج 1 تا 12 از 12

نام تاپیک: کار عملگرهای Or و and هنگام اختصاص یک مقدار به یک متغیر

  1. #1

    کار عملگرهای Or و and هنگام اختصاص یک مقدار به یک متغیر

    با سلام
    میخواستم بدونم که هنگام اختصاص یک مقدار به یک متغیر ، وقتی بین دو مقدار از Or یا and استفاده میکنیم ، چه اتفاقی می افته ؟
    مثال زیر رو نگاه کنید :
    var
    S : String;
    begin
    S := IntToStr(1 or 2);
    end;


    در مثال بالا مقدار متغیر S برابر با 3 خواهد شد ! ، چرا ؟
    یا اگر در کد بالا به جای Or از and استفاده کنیم ، مقدار S برابر با 0 خواهد بود !! ؟

    البته منظورم فقط در مورد اعداد نیست ، کلا برنامه ( یا کامپایلر ) در این موارد چه رفتاری نشون میده ؟

    اگر یکی از دوستان در این زمینه اطلاعاتی بهم بده ممنون میشم ...
    خیلی کنجکاو شدم بدونم ...

    با تشکر از همگی ...

  2. #2
    کاربر دائمی آواتار SYNDROME
    تاریخ عضویت
    فروردین 1386
    محل زندگی
    تهران
    پست
    2,814

    با سلام

    در زمانی که شما بین دو عدد And یا OR می گذارید مثلا این است که دو عدد را به مبنای 2 برده و سپس آنها را با هم And یا OR کرده اید.
    مثلا
    عدد 1 در مبنای 2 : 01
    عدد 2 در مبنای 2 : 10
    حالا اکر شما این دو عدد را Or کنید برابر 11 و اگر And کنید برایر 00 در مبنای 2 می شود.
    حالا جواب OR برابر 3 و جواب And برابر 0 می شود.
    موفق باشید

  3. #3
    ممنون جناب Syndrome
    اما این جواب من نبود !
    در زمانی که شما بین دو عدد And یا OR می گذارید مثلا این است که دو عدد را به مبنای 2 برده و سپس آنها را با هم And یا OR کرده اید.
    خوب می تونه مثل این هم باشه که دو عدد رو در مبنای هشت ببریم و بعد بینشون And و Or بزاریم ...
    منظور من اینه که کامپایلر وقتی به چنین چیزی برخورد میکنه چی کار میکنه که مقدار برابر با ( مثلا ) 3 یا مثلا 0 میشه ؟! ( در کد پست اول )
    حالا اکر شما این دو عدد را Or کنید برابر 11 و اگر And کنید برایر 00 در مبنای 2 می شود.
    حالا جواب OR برابر 3 و جواب And برابر 0 می شود.
    من نگفتم که جواب Or برابر با 3 و جواب And برابر با 0 میشه !! ( اصلا 3 یا 0 نمیشه ! )
    جواب بستگی به عددی داره که استفاده میشه که چون من 1 و 2 رو استفاده کردم ، اومد 3 ، حالا چرا ؟ نمی دونم ! ، سئوالم هم همینجاست ... ! چرا ؟

    با یک عدد دیگه امتحان کنید ، مثلا برای اعداد 30 و 21 و با عملگر or جواب میشه 31 !!

    با تشکر ...

  4. #4
    جوابی که سیندروم بهت داد درست بود . در پاسکال OR , AND بصورت عملگرهای باینری هم تعریف شده اند و اتفاقا خیلی هم کاربرد دارند.
    ببین باید حواست باشه که سیستم همه چیز رو بصورت باینری میبینه ، وقتی یک متغیر رو بصورت Integer تعریف میکنی پس یعنی براش 2 بایت فضا در نظر گرفتی یعنی 2 تا 8 تایی 1 و 0.
    پس مثلا 1 میشه : 00000001 00000000 و عدد 2 میشه 00000010 00000000 و همینطور...
    حالا عملگرهای باینری تک به تک روی بیتهای این اطلاعات اثر میکنند.
    اینکه چرا میبرند به مبنای 2 و چرا اینطوری جواب میدهند دیگه بنا به تعریفشونه ، شما هم میتونید یک متغیر بنویسید که عداد رو ببره به مبنای 8 و بعد روشون عملیاتی رو طبق تعریف شما انجام بده، اما AND , OR ، SHL, SHR و ... تعریفشون با نگاه باینری به اعداد هست.

    اینم 30 و 21
    00011110 : 30
    00010101 : 21
    ----------- OR
    00011111 : 31

  5. #5
    ممنون ...
    اما نتیجه ای که بدست می یاد به چی ربط داره ؟
    مثلا در کدی که در پست اول گذاشتم چرا نتیجه میشه 3 ( با عملگر OR ) و چرا میشه 0 ( با عملگر And ) ؟!

    با تشکر ...

  6. #6
    ببین تعریف عملگر باینری AND و OR مثل تعریف عملگر بولی هست بشرطی که بجای False عدد 0 و بجای True عدد 1 رو بزاری یعنی مثلا :


    True And False --> False 1 And 0 --> 0
    True Or False --> True 1 or 0 --> 1
    False And False --> False 0 And 0 --> 0
    True or True --> True 1 or 1 --> 1

    حالا تک تک بیتها رو با این قانون با هم ارکیب کن یعنی بیت اول عدد اول با بیت اول عدد دوم و به همین ترتیب....

  7. #7
    ممنون ...
    تا حدودی متوجه شدم ...
    ولی این موضوع در مورد بقیه انواع داده ای چطوریه ( به جز اعداد )
    برای مثال جناب خرسندی یک مقاله در مورد CreateParam در سایت گذاشته بودن ، توی اون قسمتی به صورت زیر کدنویسی شده :

    procedure TForm1.CreateParams(var Params: TCreateParams);
    begin
    inherited CreateParams(Params);
    Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
    end;


    در کد بالا و در خط 4 ، عملگر Or چه کاری انجام می ده ؟ ( در مقاله گفته شده که با Or مقدار WS_EX_APPWINDOW به ExStyle اضافه میشه ...
    اما چطور ؟ مفهوم این کد چیه ؟
    ...

  8. #8
    در کد بالا و در خط 4 ، عملگر Or چه کاری انجام می ده ؟ ( در مقاله گفته شده که با Or مقدار WS_EX_APPWINDOW به ExStyle اضافه میشه ...
    اما چطور ؟ مفهوم این کد چیه ؟
    در واقع WS_EX_APPWINDOW یک ثابت عددی است. اگر کلید Ctrl را نگه دارید و بر روی آن کلیک کنید، در نهایت به یک عدد در مبنای 16 میرسید (که احتمالا در یونیت Windows تعریف شده). در کد بالا، مقدار موجود در ExStyle با عدد نسبت داده شده به WS_EX_APPWINDOW "یا" (OR) میشه. در واقع بجای اینکه برای ExStyle چندین متغیر تعریف بکنند، یک متغیر Integer تعریف کردند هر بیت آن نشان دهنده یک استایل خاص است؛ یعنی اگر بیت شماره یک مقدار 1 داشته باشه، استایل مربوط به اون بر روی پنجره اعمال میشه، اگر هم مقدار صفر داشته باشه، استیل مربوط به آن از پنجره حذف میشه. این مسئله برای سایر 31 بیت موجود در متغیر Integer صادق هست.
    حالا اگر کسی بخواد فقط یک استایل خاص را فعال کند و به سایر استایل ها کاری نداشته باشه، باید بیت مربوط به آن استایل را پیدا کرده و مقدار آن را 1 کند. دوستان توضیح دادند که در عمل OR اگر یکی از مقادیر مورد بررسی 1 باشد، نتیجه عمل OR هم یک می شود. پس برای 1 کردن مقدار بیت مورد نظر، فقط کافی است که آن را با عددی OR کنیم که برای آن بیت مقدار 1 داشته باشد. در این صورت چه مقدار آن بیت در ExStyle صفر باشد، چه یک، نتیجه عمل OR ما 1 می شود؛ یعنی مقدار بیت مورد نظر در ExStyle با 1 جایگزین می شود. اما برای اینکه این عمل OR بر روی سایر بیت ها تاثیر نداشته باشد، باید عدد مربوطه طوری انتخاب شود که سایر بیت های ExStyle را با صفر OR کند. پس این عدد یک عدد 32 بیتی (Integer) باید باشد که همه بیت های آن به غیر از یک بیت صفر باشد. آن یک بیتی که باید 1 باشد، بیت متناظر با آن استایل خاص در ExStyle است. عددی هم که به WS_EX_APPWINDOW نسبت داده شده، در واقع همچین عددی است، اما چون نوشتن و خواندن 32 رقم صفر و یک کار مشکلی است، این ارقام در مبنای 16 (هگزا) نوشته میشند. اگر همان عدد در مبنای هگزا را تبدیل به مبنای 2 (باینری) بکنید، می بینید که تمام بیت های آن به غیر از یکی، همگی صفر هستند.
    برای اینکه مسئله بیشتر روشن بشه، یک مثال فرضی با 8 بیت می نویسم.
    در این مثال، عدد 221 را با 32 OR می کنیم تا بیت سوم (از سمت چپ) آن یک شود و مقدار 253 بدست بیاد.
    i
    221 = 11011101
    OR
    32 = 00100000
    -------------
    253 = 11111101
    حالا می تونید فرض کنید که هر یک از این یک و صفر ها نشان دهنده مقدار یک استایل خاص برای ExStyle باشند. با 1 کردن مقدار هر کدام از این بیت ها، در واقع ویندوز استایل مورد نظر شما را فعال میکنه. از اونجایی که حفظ کردن این عددها کار آسونی نیست، برای هر کدام از آنها یک ثابت عددی با نامی قابل فهم در نظر گرفته شده (مثل همین WS_EX_APPWINDOW) که می تونید بجای آن اعداد، ازشون استفاده کنید.


    وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
    و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.

  9. #9
    با تشکر از جناب کشاورز و سایر دوستان ...
    دیگه فکر کنم تقریبا کاملا متوجه شدم ... ، برای مثالی که خودتون زدید من به جای Or از and استفاده کردم و عدد 0 اومد ... ، این طور متوجه شدم که عملگر and به جای اینکه 1 های عدد باینری 32 رو به عدد 221 ببره ، 0 های اون رو برده و با 1 ها جایگزین کرده که جواب برابر با 0 شده ... ( که البته جناب کوشا توضیح داده بودند و من تازه متوجه شدم )

    راستش شاید این سئوال کمی اضافی یا کمی بی مورد باشه اما سئوال اینه که چرا Or و and ؟!
    راستش یه خورده که فکر می کنم می بینم مثلا بهتر بود جای Or با and عوض می شد ! ، اگر بخوایم این عمل رو به صورت فارسی بیان کنیم ، یه جورایی جور در نمی یاد !
    مثل این میمونه که به یک نفر بگیم که مثلا بین X و Y یکیشون رو انتخاب کن و اون شخص هر دو رو انتخاب کنه !!
    و توی and هم مثل این میمونه که به یک نفر بگیم که مثلا هم X و هم Y رو انتخاب کن و اون شخص هیچ کدوم رو انتخاب نکنه ... !!

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

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

  10. #10
    کاربر دائمی آواتار پرواز
    تاریخ عضویت
    مرداد 1386
    محل زندگی
    شیراز
    پست
    321
    راستش شاید این سئوال کمی اضافی یا کمی بی مورد باشه اما سئوال اینه که چرا Or و and ؟!
    راستش یه خورده که فکر می کنم می بینم مثلا بهتر بود جای Or با and عوض می شد ! ، اگر بخوایم این عمل رو به صورت فارسی بیان کنیم ، یه جورایی جور در نمی یاد !
    اگه بخوایم به فارسی برگردونیم مثل اینه که صفر (False) رو با غلط و یک (True) رو با صحیح نشون بدیم. حالا بحث به این شکل در میاد:
    True And False: آیا مقدار متغیر اول و دوم صحیح است؟ ----> خیر(False)
    True Or False: آیا مقدار متغیر اول یا دوم صحیح است؟ ----> بله(True)
    True And True: آیا مقدار متغیر اول و دوم صحیح است؟ ----> بله(True)
    ... و الی آخر...
    که البته این شکل محاوره ای بسیار ساده این مطلبه.

  11. #11
    اگه بخوایم به فارسی برگردونیم مثل اینه که صفر (False) رو با غلط و یک (True) رو با صحیح نشون بدیم. حالا بحث به این شکل در میاد:
    True And False: آیا مقدار متغیر اول و دوم صحیح است؟ ----> خیر(False)
    True Or False: آیا مقدار متغیر اول یا دوم صحیح است؟ ----> بله(True)
    True And True: آیا مقدار متغیر اول و دوم صحیح است؟ ----> بله(True)
    ... و الی آخر...
    که البته این شکل محاوره ای بسیار ساده این مطلبه.
    ممنون ...
    میشه همین مثال رو در مورد اعداد ( مثلا عددهای موجود در پست آقای کشاورز ) بزنید ؟!

    ...

  12. #12
    کاربر دائمی آواتار پرواز
    تاریخ عضویت
    مرداد 1386
    محل زندگی
    شیراز
    پست
    321
    نقل قول نوشته شده توسط Mahmood_N مشاهده تاپیک
    ممنون ...
    میشه همین مثال رو در مورد اعداد ( مثلا عددهای موجود در پست آقای کشاورز ) بزنید ؟!

    ...
    اینو من تو مثالم گفتم که به جای عدد "یک" مقدار "True" و یا به طور محاوره ای "صحیح" رو به کار ببرید. حالا شما بیا عددهای مثال آقای کشاورز رو نظیر به نظیر با متغیر Or با هم مقایسه کن و جوابش رو بدست بیار.
    مثال آقای کشاورز:
    221 = 11011101
    OR
    32 = 00100000
    -------------
    253 = 11111101

    برای رقم اول به طور مثال میشه:
    1 or 0
    که میشه معادل
    True Or False  ---->  True

    پس جواب طبق توضیح در پست 10 میشه True و همانطور که گفتیم True برابر 1 است که همانطور که مشاهده میشود اولین رقم حاصل 1 میباشد.

قوانین ایجاد تاپیک در تالار

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