الگوریتم زیر را در نظر بگیرید. این الگوریتم عدد نامنفی x را به عنوان ورودی دریافت می کند و عدد صحیح z را به عنوان خروجی برمی گرداند.
منظور از ⌊x⌋ بزرگترین عدد صحیح کوچکتر یا مساوی x است. منظور از x⊕y نیز عمل XOR بیتی بین این دو عدد است که برابر است با حاصل جمع تمام ۲iهایی که بیت iام از سمت راست (با شروع از اندیس صفر) در دقیقا یکی از آن دو عدد٬ برابر با «یک» باشد. برای مثال XOR هر عددی با صفر خود همان عدد می شود و ۱۴ = ۵ ⊕ ۱۱.
به ازای چند x کمتر یا مساوی ۱۰۲۳ خروجی این الگوریتم برابر با صفر است؟
پاسخ
گزینهی «۲» درست است.
ابتدا باید توجه داشته باشیم که نمایش دودویی عدد⌊x2⌋همانند عدد x است با این تفاوت که راست ترین رقم آن حذف شده است . نمایش دودویی عدد⌊x4⌋هم همانند x است با این تفاوت که دو رقم سمت راست آن حذف شده است .
در مرحله ی اول بررسی الگوریتم ، می خواهیم ببینیم با رسیدن به خط 4 برنامه ، y چه عددی را نشان میدهد . با توجه به توضیح بالا در هر بار اجرای خط 2 ، رقم سمت راست x خذف شده و عدد جدید با y ،XOR می شود. به این ترتیب میتوان گفت به ازای رقم k ام نمایش دودویی x ،XOR آن رقم با رقم های سمت چپ آن در جای رقم kام نمایش دودویی y قرار داده می شود.
حال باید ببینیم z در چه صورت صفر است. در طی اجرای الگوریتم ابتدا اولین رقم سمت راست نمایش دودویی y را به z اضافه کرده سپس دوبرابر میکنیم. پس از آن رقم سوم نمایش دودویی y را به z اضافه کرده و آن را دو برابر میکنیم و پس از آن رقم پنجم ، هفتم و … . در هیچ یک از این مراحل رقم اضافه شده به z نباید صفر باشد. بنابراین z در صورتی صفر است که از سمت راست نمایش دودویی y رقم اول ، سوم ، پنجم ، هفتم و … صفر باشد .
اگر y فردرقم داشته باشد در نمایش دودویی آخرین رقمی که به z اضافه میشود سمت چپ ترین رقم y در نمایش دودویی آن است . از آنجایی که این رقم 1 است پس z دیگر صفر نخواهد بود.
اما اگر y زوج رقم داشته باشد ، در نمایش دودویی سمت چپ ترین رقم 1 است. اما چون رقم بعدی آن (دومین رقم از سمت چپ) در جایگاه رقم فرد قرار دارد پس باید 0 باشد. بنابراین این رقم باید در x یک باشد تا XOR آن با آخرین رقم برابر صفر شود .(زیرا این رقم به z اضافه میشود) . بعد این دو رقم باید XOR رقم سوم و چهارم از سمت چپ نمایش دودویی x ، 0 باشد.(چون XOR چهار رقم اول از سمت چپ در جای چهارمین رقم از سمت چپ y قرار میگیرد. به همین ترتیب XOR رقم پنجم و ششم هم باید صفر باشد . و پس از آن هم به همین ترتیب. پس اگر این ارقام را دوتا دوتا دسته بندی کنیم همهی دستهها به جز چپترین دسته که یک حالت دارد ، دو حالت دارند (11 یا 00) .
حال با توجه به تعداد ارقام x ، تعداد حالات ممکن برای x را میشماریم :
و در کل 32 عدد ممکن برای x خواهیم داشت.