💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در ۵ آذر ماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۲ محمدرضا
bitwise operator '&'
جامعه پی اچ پی ایجاد شده در ۳۰ بهمن ۱۳۹۸

چطور میشه توسط این عملگر اعداد زوج و فرد رو تشخیص داد؟

برای توضیح اول چند مفهوم را با هم بررسی کنیم:

  • اپراتورهای Bitwise:
    این اپراتورها برای اجرای عملیات‌های بیتی(منظور بیت به بیت) به کار می‌روند. عملیات‌های چهاگانه ریاضی به منظور پردازش سریعتر می‌توانند به این شکل استفاده شوند.
    با توجه به مثال، اپراتور & را بررسی می‌کنیم:
     
  • & (Bitwise AND)
    یک اپراتور باینری (دودویی یا همون ۱-۰) ، که به منظور عملیات AND (همون ضرب خودمون) بیت‌ها به کار می‌رود. مقدار خروجی این عملیات تنها زمانی برابر ۱ یا True است که مقادیر ورودی همگی برابر ۱ باشند.(مثل ضرب که داریم: ۱=۱*۱)
     معمولا مفهوم بالا را توسط یه جدول به نام جدول صحت (Truth Table) بیان می‌کنند:
    جدول صحت

    خب، حالا چطور توسط تابع زیر می‌توان زوج یا فرد بودن رو تشخیص داد؟
    function odd($value)
    {
        return ($value & 1);
    }

    از آنجایی که این اپراتور به منظور عملیات‌های باینری استفاده می‌شود، پس مقدار value$ که ما به آن یک عدد دسیمال( عدد صحیح مانند:۱ و۲ و۳ و ... ) می‌دهیم در این عملیات به صورت باینری در نظر گرفته می‌شود، به عنوان مثال عدد دسیمال ۵ برابر عدد باینری ۱۰۱ می‌باشد.
     

  • مسئله جدید: چجوری ۵ تو باینری میشه ۱۰۱ !؟
    برای تبدیل اعداد دسیمال به باینری باید عملیات تقسیم بر ۲ را به صورت متوالی انجام داد، به عنوان مثال:
    باینری به دسیمال

     

  • حالا شد ?. پس مقدار باینری value در ۱ AND (ضرب) میشه و می‌توان زوج یا فرد بودن عدد را تشخیص داد. به همین راحتی

    امیدوارم متوجه شده باشید

 

 

 

عملگرهای بیتی معمولا سرعت بالایی دارند و اگر بتونید عملیات رو با اونها هندل کنید سرعت اجرا و محاسبه بالاتری دارند.

البته خوانایی و درک دلیل استفاده از اونها سخت میشه بعضا ...

لقمان آوند ۳۰ بهمن ۱۳۹۸، ۲۲:۴۹

توی سایت stack overflow نوشته :

In this case, return($var & 1); will do a bitwise AND against 0000....0001 returning 1 or 0 depending on the last bit of $var.

If the binary representation of a number ends in 0, it is even (in decimal).

If the binary representation of a number ends in 1, it is odd (in decimal).

طبق این توضیح چرا ما وقتی توابع رو به شکل زیر تعریف می‌کنیم نتیجه ای نمی‌گیریم ؟

طبق کد زیر اگه آخرین بیت برابر 0 باشه عدد زوج در غیر اینصورت عدد فرد هستش, پس چرا کد زیر کار نمی‌کنه؟

function odd(int $value){
  return (!($value & 0));
}
function even(int $value){
  return ($value & 0);
}

 

Amir F ۲۹ بهمن ۱۳۹۹، ۱۱:۱۸