نمایش/عدم نمایش سایدبار
رفتن به بالای صفحه
مهدی دمیرچیلو

تغییر و یا خوندن یه بیت از یک متغیر

به نام خدا : تو این مطلب از آموزش های متفرقه ++C/C میخوام به این موضوع بپردازم که چطور میشه یه بیت از یه متغییر رو خوند مقدارش رو و یا مقدار یه بیت از یه متغییر رو تغییر داد، مثلا ۰ کرد، این سری مطالبی که من انشاالله میزارم تو سایت بیشتر برای بحث نوشتن کتابخونه بدرد میخوره و فک نکنم برا پروژه های معمولی بکار بیاد.(خدا رو چه دیدی شاید هم یه وقت بکار اومد laugh )
تغییر و یا خوندن یه بیت از یک متغیر

تغییر و یا خوندن یه بیت از یک متغیر


مباحث این مطلب :

  1. ۱ کردن بیتهای یه متغیر
  2. ۰ کردن بیتهای یه متغیر
  3. Toggle کردن بیت های یه متغییر ( اگه 1بود، 0اش کن و اگه 0بود، 1اش کن )
  4. خواندن بیتهای یه متغیر
  5. NOT کردن بیت های یه متغیر ( نات کردن : تبدیل 1ها به 1 و 1 ها به 0 )

 
برای بهتر توجه شدن این مطلب، بهتره مطلب زیر رو هم بخونید، که درباره گیت های منطقی هستش، و دیدتون رو نسبت به & و | شاید یکم باز کنه که کارشون چیه و… : آشنایی مختصر با گیت های منطقی
کاربرد & و | در زبان C++/C : به & میگن اند(اند بیتی) و به | میگن اور(اور بیتی) که هر دو مورد تو درس مدار منطقی هستند و توضیح داده میشوند، اگه مثلا A و B  دو متغییر ۱ بیتی باشن(یعنی یا ۰ هستن و یا ۱)، اند و اور این دو متغییر در تمامی حالات به صورت جداول زیر هستش :

A&B B A
۰ ۰ ۰
۰ ۱ ۰
۰ ۰ ۱
۱ ۱ ۱
A|B B A
۰ ۰ ۰
۱ ۱ ۰
۱ ۰ ۱
۱ ۱ ۱
اگه میخواین جدول بالا رو حفظ کنید میتونید از این روش استفاده کنید : تو & کردن، بیت ها ضرب در هم میشن و تو | کردن بیت ها با هم جمع میشن (و البته تو حالتِ آخرِ اور کردن ۱+۱ هم ۱ میشه.)
 
در دو عکس زیر ۲ مثال برا اور و دو مثال برا اند بیتی براتون نوشتم و گزاشتم، که با توجه به جدول بالا اند و اور متغییر ها رو حساب کردم.
آموزش برنامه نویسی میکرو
 
برنامه نویسی میکرو
 
توجه : در کد بالا متغییر ۰b00000100 از نوع باینری هستش، که بر حسب دسیمال(۱۰ دهی) مقدارش میشه ۴ و به صورت هگزا دسیمال هم اگه بخوام بنویسمش میشه ۰x04، بگذریم از این موضوع، برای مطالعه بیشتر در مورد انواع فرم نمایش اعداد، میتونید کلمات کلیدی زیر رو تو گوگل بسرچید تا کلی مطلب براتون بیاد بالا :

  • اعداد باینری
  • اعداد دسیمال
  • اعداد هگزا دسیمال

 

1 کردن یه بیت از یه متغییر

برای این کار باید از | بیتی (اور بیتی) به صورت زیر استفاده کنیم(فرض من براینه که شما الان نحوه & و | کردن بیت ها رو بلدید) :

که در کد بالا (با فرض این که شمارش بیت ها از ۱ شروع میشه) بیت۲ متغییر Z رو ۱ میکنیم. (عکس بالا رو ببینید متوجه میشید که چرا بیت۲ متغییر Z یک میشه)
حالا اگه بخوایم بیت ۶ ام متغییر Z رو ۱ کنیم باید از کد زیر استفاده کنیم :

و اگه بخوایم مثلا ۲ بیت از متغییر Z رو ۱ کنیم، مثلا بیت های ۱ و ۸ رو میخوایم یک کنیم، باید :

و …
 

0 کردن یه بیت از یه متغییر

برای این کار باید از & بیتی (اند بیتی) به صورت زیر استفاده کنیم :
در کد زیر، بیت۱ متغییر Z رو ۰ میکنیم

و اگه بخوایم بیت ۶ متغییر Z رو ۰ کنیم باید :

و اگه بخایم دو بیت ۲ و ۳ از متغییر Z رو ۰ کنیم باید :

 
مثال برنامه نویسی ۱
مثال زیر رو هم میتونید در نرم افزار Dev-Cpp تست کنید و پروژه های نمونه تون رو هم میتونید در همین نرم افزار تست کنید.

 
کد زیر از مثال بالا هم مربوطه به شیفت دادن اعداد(که میتونید تو نت سرچ کنید دربارش)

کد بالا میاد عدد ۱ = ۰b00000001 رو به اندازه PWR_UP به سمت چپ شیفت میده
مثلا اگه PWR_UP=1 باشه، حاصل کد بالا میشه ۰b00000010 و اگه مثلا PWR_UP=5 باشه حاصل کد بالا میشه ۰b00100000
 
توجه : راه ساده تر دیگه اینه که از عملگر ~ استفاده کنیم که کارش NOT هستش ( یعنی 0ها رو 1 و 1ها رو 0 میکنه )؛ خب همون طور که گفتیم مثلا اگه بخوایم بیت 0 ام یه ریجیستر رو مقدار 0 بهش بدیم، به طوری که مقدار بقیه بیت ها تغییر نکنه به صورت زیر عمل میکنیم :
1) اول اون بیتی که میخوایم 0 اش کنیم رو 1 میکنیم : 0x01 یا بهتره به فرم مقابل بنویسیم : (0>>1)
2) بعد علامت Not رو پشتش قرار میدیم : 0x01~ که این برابر میشه با 0xFE ( به فرم باینری میشه 0b11111110 )؛ بهترین فرم نمایش و استفاده به صورت مقابل هستش : (0>>1)~
3) بعد این مقدار رو با رجیستر مد نظر & میکنیم؛ کد زیر رو ببینید :

 

Toggle کردن بیت های یه متغییر

در کد بالا، number عددی هستش که میخوایم بیت xامش رو Toggle کنیم.
 

خوندن یه بیت از یه متغییر

توجه : تو برنامه زیر باید اون متغییر های باینری رو بر حسب دسیمال و یا هگزا دسیمال بنویسید، چون نرم افزار Dev-Cpp اعداد باینری رو پشتیبانی نمیکنه مثل این که، شاید هم این نسخه ای که من استفاده میکنم این طور باشه، شاید هم….(تو کد بالا من بر حسب باینری نوشتم تا متوجه بشید)
برای این موضوع هم مثال زیر فک کنم کافی باشه.
مثال برنامه نویسی ۲

 

NOT کردن بیت های یه متغیر 

اینم من در بالا ازش استفاده کردم، تو بحث ۰ کردن بیت های یه متغییر ازش استفاده کردم، در زیر یه مثال براش میزارم، نگاه کنید سریع متوجه میشید، مفدار متغییر رو از مقدار ماکزیمم مقدارش کم کردم و بعد تفریق کردم، و بعد تموم بیت های متغییر ام Not شد.(به همین راحتی و به همین خوشمزگی laugh )

توجه مهم : تو روش 1؛ نوع عدد زیاد مهم نیست که int باشه char باشه ( چند بیتی باشه ) ولی تو روش دوم مهمه! اینو در نظر بگیرید همیشه، مثلا عدد شما 0000001 هستش ( عدد 1 که فرم باینریشو من نوشتم ) که متغییرتونو char تغریف کنید روش دو عدد فوق رو به صورت 11111110 ( 254 ) در میاره ولی اگه متغییرو int ( که 16 بیتی هستش حالا باز بستگی به کامپایلر هم داره که چند بیتی باشه ) استفاده کنید عددو 0000000000000001 در نظر میگیره و بعد از not کردنش عدد ما میشه 1111111111111110 ( ‭65534‬ ) لذا این نکته رو حواستون باشه همیشه.
 
فعلا تا مطلب بعد یا علی
راستی اگه جایی رو بد/کم/و…!!! توضیح دادم بگید تا مطلب رو بهتر کنم و بیشتر و بهتر توضیح بدم و اگه جایی هم اشتب کردم اونم بگید، دمتون گرم، فعلا bye

پسورد فایل های سایت :
www.dmf313.ir
مهدی دمیرچیلو جنگ ما فتح قدس را در پی خواهد داشت (امام خمینی) >>>>>> اگر از صدام بگذریم، اگر مسأله قدس را فراموش کنیم، اگر از جنایت های امریکا بگذریم از آل سعود نخواهیم گذشت. ان‌شاالله اندوه دلمان را را در وقت مناسب با انتقام از امریکا و ال سعود برطرف خواهیم کرد و داغ و حسرت حلاوت این جنایت بزرگ را بر دلشان خواهیم گذاشت و با برپایی جشن پیروزی حق بر جنود کفر و نفاق و آزادی کعبه از دست نااهلان و نامحرمان به مسجد الحرام وارد خواهیم شد (امام خمینی)
ارسال دیدگاه
17

1) تعداد حروف غیر فارسی از حروف فارسی بیشتر باشه دیدگاه به صورت خودکار حذف میشه.

2) به موارد درخواست پروژه/کد آماده و سوالاتی که بلد نباشم پاسخ داده نمیشه.

3) برای گزاشتن کدهاتون از این سایت استفاده کنید : debian

  1. Avatar

    مهمان

    sajjad

    سلام .خسته نباشید…ببخشید برا تراش چوب هایی کوچیک نیازمند چه بوردها و موتورهایی هستیم؟خیلی ممنون میشم راهنماییم کنید مهندس?…..جیمیل یا تلگرام اگ جواب بدین واقعا واقعا لطف میکنین

    1397/10/30
    12:03
  2. Avatar

    مهمان

    حمید

    یادم رفت بگم if که مینویسم فقط ایف اول رو میخونه یا میریزه بهم

    1397/10/29
    12:12
  3. Avatar

    مهمان

    حمید

    سلام مهندس
    اول از همه دستت درد نکنه
    ببخشید من میخوام یه وقفه بیرونی با کلید یک بنویسم که هر وقت فراخوان شد پایه ی خروجی فلان رو معکوس کنه همون تاگل کنه ممکنه؟
    آخه یه مسعله ای هست هر بار که کلید رو فشار میدم خروجیم از حالت low به highتبدیل میشه بعدش بارها کردن کلید لو میشه دستمو نگه میدارم تو high میمونه
    چکار کنم؟ کاری که میخوام کنم بعد از هر بار تغییر وضعیت کلید مدت زیادی مثلا کلید رها یا فشرده میونه میتونی کمک کنی خدا خیرت بده

    1397/10/29
    12:11
    • مهدی دمیرچیلو

      نویسنده این مطلب

      مهدی دمیرچیلو

      سلام

      وقفه بیرونی

      معمولا بهش میگن “وقفه خارجی”

      میخوام یه وقفه بیرونی با کلید یک بنویسم که هر وقت فراخوان شد پایه ی خروجی فلان رو معکوس کنه همون تاگل کنه ممکنه؟

      آره چرا نشه – شما تو تابع وقفه فوق، میای هر کدی که نیاز داشتی قرار میدی / خب این موردی که میگید

      آخه یه مسعله ای هست هر بار که کلید رو فشار میدم خروجیم از حالت low به highتبدیل میشه بعدش بارها کردن کلید لو میشه دستمو نگه میدارم تو high میمونه

      علت این مشکل – اینه که شما منبع رخ دادن وقفه رو، روی Any Change ( هر تغییری ) تنظیم کردید لذا وقتی کلید رو فشار میدی و ولش میکنی – دوبار وقفه رخ میده –

      1) اگر کلید شما pull down هستش :
      1.1) میخواید وقتی کلید فشرده شد وقفه رخ بده : باید مد وقفه خارجی رو، روی Risinge Edge تنظیم کنید.
      1.2) میخواید وقتی کلید فشرده شد و بعد رها شد وقفه رخ بده : باید مد وقفه خارجی رو، روی Faling Edge تنظیم کنید.

      2) اگر کلید شما pull up هستش :
      2.1) میخواید وقتی کلید فشرده شد وقفه رخ بده : باید مد وقفه خارجی رو، روی Faling Edge تنظیم کنید.
      2.2) میخواید وقتی کلید فشرده شد و بعد رها شد وقفه رخ بده : باید مد وقفه خارجی رو، روی Risinge Edge تنظیم کنید.
      Risinge Edge - Faling Edge - Level Edge

      1397/10/29
      12:41
  4. Avatar

    مهمان

    کیمیا

    سلام خسته نباشید
    من می خوام یک بیت از یک متغیر رو بریزم مثلا روی پین 0 پورت C ولی کدویژن ارور می گیره
    PORTC.0=pattern.0
    ممنون می شم راهنماییم کنین

    1397/06/17
    11:38
  5. Avatar

    مهمان

    سیداحمد موسوی

    سلام مهندس واقعا آموزش عالی و جامعی بود لطفا معنی این کد رو که نوشتید (۰>>۱ ) را شرح دهید البته نوشته اید که این کد مقدار اون بیت مورد نظر رو صفر می کنه اونوقت در جای دیگه ای ادبیات خواندن این کد اینجوری شرح داده شده (یک به میزان صفر تا به چپ شیفت داده شود)

    1396/06/05
    06:38
    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام
      خودتون توضیح دادین دیگه
      ۱رو ۰ واحد شیفت دادم سمت چپ

      1396/06/05
      08:51
  6. Avatar

    مهمان

    amin

    toggle کردن را من متوجه نمیشم میشه بیشتر توضیح بدی چطوری toggle میشه؟

    1396/04/28
    03:21
    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      خب ببین تاگل کردن یعنی همون ۰ رو ۱ کردن بلعکس
      عملگر ^ یه xor بیتی هستش که تو نت و تو سایت ( گیتهای منطقی ) بسرچی آموزشش هستش.
      برا بقیش دست به کاغذ بشی متوجه میشی
      فقط اینو بگم که تو اینجا یه طرف داستان number هستش که قراره بیت x امش تاگل بشه و یه طرف داستان
      ۱ < < x
      هستش، تو Xor هم اگه یه طرف داستان ۱ باشه،...

      1396/04/28
      04:53
  7. Avatar

    مهمان

    amin

    عالیه عزیز . خدا خیرت بده

    1396/04/28
    03:20
  8. Avatar

    مهمان

    amirmasoud

    دارم تراکتوری یه بار دیگه یاد می گیرم
    همه سایتو می خونم 47 صفحه رو
    واقعا لذت بخشه مخصوصا مطالب بروزش

    1395/08/07
    10:08
  9. Avatar

    مهمان

    NYRN

    خسته نباشی داداش
    خوب بود فقط یه مشکل کوچیک…
    برای صفر کردن یک بیت از داده کاری که شما میکنید یه کم اضافه کاری هست
    میتونید مستقیما از روش زیر صفر کنی بیت رو :
    z=z & 0b1111110
    مثلا بیت اول رو میخوایم صفر کنیم مستقیما and می کنیم!
    با تشکر

    1394/12/02
    07:12
    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      از این نظر درست میگید…برای صفر کردن فقط فقط یه بیت از یه ریجستر همین کار مناسبه
      و برا صفر کردن چندین تا اون کدی که من نوشتم مناسب تره برا حلقه ها و …
      دمت گرم بابت راهنماییت. heart

      1394/12/02
      08:54
  10. Avatar

    مهمان

    امیر

    سلام آقا مهدی
    مطالبی ک میذاری حرف نداره/.
    ی مطلب و مثال خوب
    در مورد مبحث پوینتر هم اگه تو سر فصل مباحث زبان c بذاری
    خیلی عالی میشه….

    1394/11/24
    10:30
    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام
      والا برا اشاره گر امروز داشتم فایل ها و پاورپونت ها و مطالب سایت ها رو میخوندم…..بعضی فایل هایی پیدا کردم که در حد تیم ملی توضیح دادن…..ایشاالله یه تسلطی به تمام موضوعات مربوطش پیدا کنم و یه سر فصل تهیه کنم و مطلبش رو میزارم، البته فک نکنم چیز خاصی بگم…اون فایلها و اون لینک ها رو میزارم و یه سر فصل کامل میزارم و میگم اینو از این فایل بخونین اینو از اون فایل اون یکی رو از فلان سایت، و اگه چیزی جا موند رو خودم میگم؛ و سعی میکنم مثال هایی رو هم بگم(چون تو این فایل ها و سایت ها از نظر مثال خوب کار نشده)

      1394/11/24
      11:52
      • Avatar

        مهمان

        امیر

        سلام مجدد
        راستی ما همیشه اگه قابل باشیم ، خط آخر فرمایشات آخر پست های شما رو به دیده منت میذاریم
        و
        دعا گوی شما هستیم…
        تو اینترنت همه چی هست …. اما برای کسی ک تازه کار باشه
        جمع بندی این پراکندگی ، گاهی اوقات اونقد سخت میشه ک…همچنان تازه کار میمونه… smile
        اما هنرشما اینه که همه رو ی جا جمع میکنی ، ی مثال هم بهش اضافه میکنی….
        ی دونه ای ، حق استادی داری گردن ما….
        خیلی مخلصیم….

        1394/11/26
        12:41
        • مهدی دمرچیلو

          نویسنده این مطلب

          مهدی دمرچیلو

          سلام
          جدا این مطلب خوبه؟ shock
          من خودم پیش خودم میگفتم الان ملت میان نظر میزارن که این چه مطلبی هستش، بدرد نمیخوره ، خیلی بد توضیح دادی و… laugh (جدی میگم)
          استاد چیه داش امیر…نوکرتیم داش focus

          1394/11/26
          01:22