כיצד ניתן לדעת איזה מספר הוא חיובי ואיזה הוא שלילי מבלי להשתמש ב IF וכו'. - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

כיצד ניתן לדעת איזה מספר הוא חיובי ואיזה הוא שלילי מבלי להשתמש ב IF וכו'.


chenrp

Recommended Posts

כלומר, אם יש לי מספר אני רוצה לדעת אם הוא חיובי או שלילי אך בעזרת פעולות מתמטיות בלבד ללא שאילתה.

תודה לעונים.

איזו מין שאלה זו? אם אתה רוצה לדעת משהו על המספר הזה תצטרך לבצע שאילתה כלשהי...

מה הבעיה לשאול אם הוא גדול מ 0? או- אם הוא שווה לערך המוחלט שלו או משהו כזה?

קישור לתוכן
שתף באתרים אחרים

תדפיס את המספר חלקי הערך המוחלט שלו.

אם יוצא 1 הוא חיובי, ואם 1- הוא שלילי.

אם אתה מנסה ליצור פונקציה אז return x/abs(x)=1

ואז יוחזר אמת אם הוא חיובי ושקר אם הוא שלילי. [abs = absolute = ערך מוחלט].

קישור לתוכן
שתף באתרים אחרים

אתה עדין צריך לבדוק איכשהו אם המספר גדול או קטן מאפס...

-----

זה מאוד תלוי בשפה שאתה עובד איתה.

לדוגמא באסמבלר.

אתה יכול ליצור מערך של 2 כתובות (פוינטרים לפונקציות) אחד לתוצאת אמת ואחד לתוצאת שקר. אתה עושה AND עם המספר שאתה רוצה לבדוק והמספר הבינארי 1000000 (למספרי 8 ביט) עושה ROL ומבצע JMP לכתובת המערך עם אינדקס המספר שקיבלת.

קישור לתוכן
שתף באתרים אחרים

תדפיס את המספר חלקי הערך המוחלט שלו.

אם יוצא 1 הוא חיובי, ואם 1- הוא שלילי.

זה גם מה שאני חשבתי, הבעיה היא שזה כמו להדפיס את המספר :lol:

אפשר גם להוסיף למספר את הערך המוחלט שלו ולהדפיס, להחסיר מהמספר את הערך המוחלט שלו ולהדפיס, אבל שום דבר לא משנה את העובדה שאנחנו מדפיסים בסוף את המספר, אחרי כמה פעולות אריתמטיות.

לא משהו מתוחכם מדי :lol:

אני לא מאמין שיש לזה פיתרון נורמאלי, כי כמו שכבר אמר omrit :

איזו מין שאלה זו? אם אתה רוצה לדעת משהו על המספר הזה תצטרך לבצע שאילתה כלשהי...

chenrp, מי נתן לך את השאלה הזו?

קישור לתוכן
שתף באתרים אחרים

אנשים, כולכם משתמשים בפונקיה או בתנאי.

אני לא רוצה לשתמש בפונקיה ולא בתנאי ולא בשאילתה!

אתה עדין צריך לבדוק איכשהו אם המספר גדול או קטן מאפס...

-----

זה מאוד תלוי בשפה שאתה עובד איתה.

לדוגמא באסמבלר.

אתה יכול ליצור מערך של 2 כתובות (פוינטרים לפונקציות) אחד לתוצאת אמת ואחד לתוצאת שקר. אתה עושה AND עם המספר שאתה רוצה לבדוק והמספר הבינארי 1000000 (למספרי 8 ביט) עושה ROL ומבצע JMP לכתובת המערך עם אינדקס המספר שקיבלת.

אתה צודק.

אני משתמש בSQL SERER

תוכל להסביר יותר בבקשה?

תודה לעונים

קישור לתוכן
שתף באתרים אחרים

#include<stdio.h>

void isNeg();
void isPos();

typedef void (*func)();
func jmpadr[2]={isPos,isNeg};

void main(void)
{
int num=10,res=0;
int tester = 0x8000; // equals 1000 0000 0000 0000
res=num&tester;
asm{
ROL res,1;
}
jmpadr[res]();
}

void isPos()
{
printf("positive");
}

void isNeg()
{
printf("negetive");
}

עריכה: WTF?! אמרת CPP...

קישור לתוכן
שתף באתרים אחרים

חחח אח שלי תודה רבה.

ערכתי מיד אחרי זה ל SQL SERVER.

סליחה.

בכל מקרה פתרתי את זה ב5 שורות.

עשיתי את זה ע"י הפרדה: ע"י שימוש ב פונצקיה ABS(שהיא בנויה לא מפונקציה כבדה אלא מפעולות אריטמטיות). החסרתי 1 וחילקתי ב 256 והכפלתי וכו'... ואז חיוביים יצאו 0 ושליליים יצאו 256

תודה לעוזרים.

קישור לתוכן
שתף באתרים אחרים

אתה מודע לכך שלא ניתן לבצע כל פעולה חשבונית כלשהי על שני משתנים בעלי גדלים שונים, נכון?

הסיבה היחידה ש-C מאפשר את זה, זה כי הוא מזהה מתי זה קורה וממיר את הקטן מבניהם לגדול. באסמבלר אתה חייב לציין את זה במפורש על ידי BYTE PTR, WORD PTR, DWORD PTR או QWORD PTR (יש עוד אחד ששכחתי). המילים השמורות הנ"ל מסמנות גודל נתון של 1,2,4,8 בתים בהתאמה.

קישור לתוכן
שתף באתרים אחרים

אם מדברים על C או אסמבלי אז יש את השיטה הידועה הבאה:

http://graphics.stanford.edu/~seander/bithacks.html#IntegerAbs

השיטה עובדת על מחשבי two's complement שיש להם arithmetic shift right וכשהקומפיילר מקמפל << של ערך עם סימן בצורה הנכונה.

99.999% שזה מתאים לכל מי שקורא את הפורום הזה.

זה מתבסס על שיטת selection שניתן לראות כאן: http://aggregate.org/MAGIC/#Integer%20Selection

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...