PDA

View Full Version : چند سوال درباره عملگر های منطقی و بیتی



hercool
یک شنبه 08 دی 1387, 08:10 صبح
سلام خدمت دوستان
چند سوال درباره عملگر های منطقی و بیتی داشتم
اول ایا فرقی بین این دو عملگر ها هست یعنی مثلا and در عملگر های منطقی با and در عملگرهای بیتی داره؟(و به همین منوال در بقیه عملگر های مشترک)
دوم اینکه اگر در عملگر and را در یک برنامه داشته باشیم این عملگر تقدم کدام ارزش رو بیشتر داره منظورم اینه که غلط یا درست
برای مثال
(3>5) and (7<8)=f
و به همین منوال در در دیگر عملگر ها
برای مثال چنین عبارتی دارای چه ارزشی است؟
not (((3-4 mod 3)<5) and ((6 div 4)<>3))
لطفا مراحل محاسبه این رو بگید و ارجحیت با کدوم است کتاب رو خواندم ولی در شکم بنابراین سوال کردم که مشکلم حلشه
ممنون

bmanfy
یک شنبه 08 دی 1387, 09:47 صبح
سلام :
And منطقی با یتی خوب تفاوت در نوع خروجی . منطقی خروجی بولین داره و بیتی خوب ریشته ای از بیتها . میشه اینطور تعبیر کرئ که بیتی همان منطقی است با این تفاوت که عملیات منطقی رو بر روی تک تک بیتها انجام میده و حاصل رو در بیت هم ارزش با اونها میریزه .
در مورد دوین سوالت : یه مقدار سوالت مبهمه و اینجوری گفتی که عملگرهای منطقی نسبت به درست یا نادرست اولویت بیشترب دارن . خوب در حالی که این سوال غلطه چون مقادیر درست و نادرست به عنوان خروجی و یا ورودی عملگر های منطقی هستند . سوالت مثل اینه که بگب عملگر جمع نسبت به اعداد منفی اولویت داره یا مثبت .
به گمانم منظورتون این بوده که اولویت کدام عملگر نسبت به دیگری بهتره .
حالا اگر همین بوده سوالتون که جوابش اینه :
در مواقعی که در مورد اولویت عملگرها نمیدونید خوب پرانتز بهترین راه حله و همیشه اول داخل پرانتز حل میشه و بحمدالله سوالتون هم کهسرشار از پرانتزه . اما خوب پرانتزاش جابه جا شده .
اما اگه بخواین اولویت رو بدونید Not از همه اولویت بیشتری داره و باقی اولویت برابر یعنی از سمت چپ به راست بررسی میشن البته همون طور که میدونید این در حالتیه که پرانتز نباشه . اما خوب با پرانتز همه کار میشه کرد .
not (((3-4 mod 3)<5) and ((6 div 4)<>3))h صورت سوالتون این بوده ؟
تو این سوال not ناچارا دیرتر از همه اجرا میشه :
حالا تو پرانتز اول پرانتز سمت چپ محاسبه میشه بعد پرانتز سمت راست :
حال پرانتز سمت چپ :
باز اول پرانتز داحل خودش یعنی (3-4 mod 3) حساب میشه و با 5 مقایسه میشه :
خوب کلا حاصل پرانتز سمت چپ مشه True
البته فکر میکنم اینجا یه خطای منطقی رخ بده (فکر میکنم نشه باقیمانده صحیح اعداد منفی رو گرفت حالا با فرض بر اینکه میشه جلو میرم )

حالا پرانتز سمت راست :
اینجا بازم اول ((6 div 4) محاسبه میشه بعد با 3 مقایشه میشه :
خوب کلا جواب پرانتز سمت راست هم میشه True

خوب حالا پرانتز سمت چپ با سمت راست And میشه :
True and True حوب میشه True

حالا میرسیم به Not :
Not True
خوب که جواب این هم میشه False
.
خوب امیدوارم جوابم درست باشه .

hercool
یک شنبه 08 دی 1387, 14:54 عصر
درست همین 4 مین خط رو منظورم بود یعنی مثلا not کل کار رو انتی میکنه یعنی اگه ارزش ما برابر true هست رو false میکنه و false رو true درسته؟
و به همین منوال بقیه عملگر ها رو ؛من تو این قضیه مشکل دارم

hercool
یک شنبه 08 دی 1387, 19:28 عصر
روش ایجاد انها در یک فایل پاسکال چیست؟
منظورم این است که چطور این مثالی که در پست اول رو زدم رو در پاسکال بزارم و اجرا کنم میشه درباره این موضوع هم توضیح دهید؟

bmanfy
سه شنبه 10 دی 1387, 19:04 عصر
درست همین 4 مین خط رو منظورم بود یعنی مثلا not کل کار رو انتی میکنه یعنی اگه ارزش ما برابر true هست رو false میکنه و false رو true درسته؟
و به همین منوال بقیه عملگر ها رو ؛من تو این قضیه مشکل دارم

برداشت من از این جمله ات اینه که دقیقا نمیدونی با اینا چه طور کار کنی :
حالا پاسخ من به این برداشت .
یک نکته که هست اینه که Not یک عملگر یک تایی است یعنی برای اینکه از اون خروجی بگیری باید یک عبارت بهش بدی . مثل همون عملگر قرینه (-) که کافیه یک عدد جلوش بنویسی و عدد جلوشو قرینه کنه Not هم به همین منوال یک مقدار یا یک عبارت رو جلوش مینویس تا بر عکس کنه .
در واقع جدول درسی او ن به این شکله :
True ---> false
False ---> True
اما در مورد باقی عملگر ها And , Or اینا دوتایی هستند مثل عملگر جمع که باید با دوتا مقدار کار کنه . And رو توی سخت افزار میگن ضرب منطقی و تو برنامه نویسی میگن "و"
خوب در And باید دو عمولوندی که با اون کار میکنن ارزش True داشته باشن .
که جدول درستی and به شکله زیره :
True , True ---> True
True , False ---> False
False , True ---> False
False , False ---> False
اما برای Or که تو سخت افزار بهش میگن جمع منطقی و در برنامه نویس هم میگن "یا"
یعنی در کل لازمه یکی از عملوندهایی که باهاشون در ارتباطه ارزش True داشته باشه.
جدول درستیش هم که به شکل زیره :
True , True ---> True
True , False ---> True
False , True ---> True
False , False ---> False


روش ایجاد انها در یک فایل پاسکال چیست؟
منظورم این است که چطور این مثالی که در پست اول رو زدم رو در پاسکال بزارم و اجرا کنم میشه درباره این موضوع هم توضیح دهید؟

یعنی نمیتونی این رو تو پاسکال اجرا کنی ؟


uses crt ;
begin
if (عبارت منطقی ) = True Theb
writeln('True'(
else
Writeln('False') ;
end .
readln() ;


باید این کد کار کنه . البته من خیلی وقته مستقیم تو پاسکال کد ننوشتم .

hercool
چهارشنبه 11 دی 1387, 19:57 عصر
سلام
واقعا کارت عالی و ممنون بابت توضیحات مفصلتون و من همونی رو می خواستم که شما توضیح دادید
اما یه سوال دارم که نخواستم براش تاپیک باز کنم اونم اینه که
این عبارت uses crt ; که اگر درست گفته باشم برای کتابخانه هست باید در هر برنامه ای باشه تا بتونه برنامه درست run بشه؟

hercool
پنج شنبه 12 دی 1387, 13:04 عصر
در مورد xor و not اگر میشه یک توضیح بدید مثل بالا

bmanfy
پنج شنبه 12 دی 1387, 17:45 عصر
سلام
واقعا کارت عالی و ممنون بابت توضیحات مفصلتون و من همونی رو می خواستم که شما توضیح دادید
اما یه سوال دارم که نخواستم براش تاپیک باز کنم اونم اینه که
این عبارت uses crt ; که اگر درست گفته باشم برای کتابخانه هست باید در هر برنامه ای باشه تا بتونه برنامه درست run بشه؟

خواهش میکنم دوست عزیز .
Uses که کلا یک کلمه ی کلیدی است تو پاسکال و Ctr همون طور که فایل کتابخانه ای هستش . اما نوشتن یا ننوشتن یک فایل کتابخانه ای در جلوی uses به این معنی نیست که نشه برنامه را اجرا کرد . در واقع بسته به دستوراتی که در برنامه تون استفاده کرده باشین باید از فایلهای کتابخانه ای استفاده کنید . تو این تکه برنامه ی بالا اگه اشتباه نکنم Readln مربوط به کتابخانه Crt باشه .
مثلا تو این برنامه ما از دوستورات گرافیکی استفاده نکردیم پس نیازی هم نبود که کتابخانه Grapgh رو فراخوانی کنیم . اما مثلا اگه از دستوری مثل Cricle که مربوط به کتابخه ی Grapgh است ، استفاده کنیم خوب قاعدتا باید از کتابخانه ی مذکور نیز استفاده کنیم .
اما خوب به دلیل اینکه دستورات اولیه پاسکال درون کتابخانه Ctr هستند عملا نمیشه بدون این کتابخانه برنامه ای نوشت .


در مورد xor و not اگر میشه یک توضیح بدید مثل بالا

not رو که یک بار در بالا گفتم . همون نقیض هستش . و ارزش خروجی رو تغییر میده . با یک عملوند هم بیشتر کار نمیکنه . عملوند (یا همون عبارت منطقی) در جلوی Not نوشته میشه .

اما Xor یا همون " یا انحصاری " که یک عملگر منطقی دو عملونده هستش . همانند And , Or . این عملگر در حالتی خروجی True داره که دو عبارت منطقی که باهاش کار میکنن ارزش نابرابر داشته باشند . به عبارتی یکی از عبارات False و دیگری True بشه .
البته عملا از این عملگر استفاده نمیشه مگر در موارد خواص همچون تهیه پشتیبان از یک سری فایلها . (البته منظور من در شاخه نرم افزاره و بحث در مورد سخت افزار فرق میکنه).
جدول درستی Xor به شکل زیره :
True , True ---> False
True , False ---> True
False , True ---> True
False , False ---> False

hercool
جمعه 13 دی 1387, 10:49 صبح
ممنون بابت کمکتون
اما چند تا نمونه سوال هست میخواستم اگر میشه حلش کنید البته چهار جوابی هست

const x=13;const y=3;
begin
writeln((x and y)+(x or y)+(not x xor y)+(x shr y)+(x shl y));
end.
گزینه ها
1-5
2-106
3-169
4-127
می دونم جواب 106 ولی می خوام بدونم چجوری این جواب بدست میاد مخصوصا در قسمت shl چون جوابش میاد 104 ولی نمی دونم چطوری همینطور هم جواب xor
می خوام بدونم در چنین مسائلی این نوع عملگر ها چجور کار می کنن and or xor not

hercool
جمعه 13 دی 1387, 10:57 صبح
write(2147483647 div 32767);
writeln(maxlongint div maxint div 255 div 127);

گزینه ها
1-655353
2-655382
3-65535255
4-error

اگر false را با f و true را با t مشخص کنیم خروجی دستور زیر کدام گزینه است


writeln(succ(true),succ(false),pred(true),pred(fal se));


گزینه ها
1-ftft
2-ttff
3-ttft
4-error
جواب این سوال 2 گزینه 1 است

hercool
جمعه 13 دی 1387, 13:22 عصر
سلام می خوام ببینم این سوال اشتباه نیست به نظرم در قسمت دوم یعنی برای مشخص کردن مقدار

a اشتباه کردن
var a,b:byte;
begin
a:=15;b:=3;
b:=b*(a div b);
a:=a*(a div b);
writeln(a,b);
end.

جواب ها
153
315
515
1515

nahiid
سه شنبه 29 خرداد 1397, 16:30 عصر
سلام . براي عمل ضرب و باقي مانده (* و % ) رو بخوام با عملگر هاي بيتي بدست بيارم بايد چطوري انجام بدم؟؟؟؟