Introduction to Programming and the C Language Bit-wise operators and bit-wise operations Revital Hollander
מוטיבציה למה נרצה לעבוד עם ביטים? מוטיבציה למה נרצה לעבוד עם ביטים? עבודה עם ביטים הינה עבודה עם חלקים של משתנים (חלק מהביטים שלהם) כאשר נרצה דגל או מספר דגלים, נוכל להחזיק אותם במשתנה אחד, כאשר כל דגל ייוצג באחד מהביטים של המספר, במקום כל דגל במשתנה נפרד. החיסכון במקום יכול להיות גדול פעולות על ביטים הינן מהירות ניתן לבצע פעולות חשבון על ידי פעולות על ביטים ולא על ידי שימוש באופרטורים אריתמטיים
Bit-Wise Operators ~ not & and | or ^ xor >> shift right << shift left
Operator ~ האופרטור הופך את כל הביטים של המשתנה ביט השווה ל-1 יהפוך ל-0 ולהיפך למשל: unsigned char x=90 הייצוג הבינארי של המשתנה הוא: x=01011010 ~x=10100101
Operator & האופרטור & מבצע של שני אופנדים x,y פעולת and על כל שני ביטים הנמצאים באותו המיקום למשל: unsigned char x=90, y=65 הייצוג הבינארי של המשתנים הוא: x=01011010 y=10100101 x&y= 00000000
Operator | האופרטור | מבצע של שני אופנדים x,y פעולת or על כל שני ביטים הנמצאים באותו המיקום למשל: unsigned char x=90, y=65 הייצוג הבינארי של המשתנים הוא: x= 01011010 y= 10100101 x|y = 11111111
פעולת XOR בהינתן שתי סיביות, האופרטור XOR שווה 1, אם X ו-Y שונים זה מזה ו-0 ,אחרת. להלן טבלת האמת של האופרטור XOR: X xor y y x 1
Operator ^ האופרטור ^ מבצע של שני אופנדים x,y פעולת xor על כל שני ביטים הנמצאים באותו המיקום למשל: unsigned char x=90, y=65 הייצוג הבינארי של המשתנים הוא: x=01011010 y=10100101 x^y=11111111
>> shift right operator האופרטור מזיז את כל הביטים של המשתנה n מקומות ימינה nביטים חדש יתווספו משמאל וערכם 0 על כל הזזה ימינה יחולק המספר ב-2 למשל: unsigned char x=90 הייצוג הבינארי של המשתנה הוא: x= 01011010 x>>1= 00101101 x>>2= 00010110 x>>3= 00001011
<< shift left operator האופרטור מזיז את כל הביטים של המשתנה n מקומות שמאלה nביטים חדש יתווספו מימין וערכם 0 על כל הזזה שמאלה יוכפל המספר ב-2 למשל: unsigned char x=90 הייצוג הבינארי של המשתנה הוא: x= 01011010 x<<1= 10110100 x<<2= 01101000 x<<3= 11010000
הדלקת ביט הדלקת ביט הינה הפיכת ביט ל-1. בדרך כלל, רוצים להדליק אחד הביטים של משתנה ורק אותו. ההדלקה נעשית על ידי שימוש "במסיכה". מסיכה הינו משתנה שכל הביטים שלו 0, פרט לביט אחד שערכו 1במיקום של הביט אותו רוצים לשנות. למשל: unsigned char x=90 x=01011010 x=x | 4 /* turn on the third bit */
דוגמא - בדיקת ביט void TestBit (unsigned char X, int Place) { X >>= Place; // x = x>> Place X &= 1; // x = x & 1 as x = x & 1 if (X) printf("1"); else printf("0"); } void main (void) { byte Num = 0x55; // הכנסת כל ערך הקסדצימלי דו ספרתי שתרצה לבדוק int i; for (i=7;i>=0;i--) TestBit(Num,i);
דוגמא – בדיקת ביט – הבדיקות TestBit(01010101,7) -> 00000000&00000001 //1st left bit is checked TestBit(01010101,6) -> 00000001&00000001 //2nd left bit is checked TestBit(01010101,5) -> 00000010&00000001 //3rd left bit is checked TestBit(01010101,4) -> 00000101&00000001 //4th lest bit is checked TestBit(01010101,3) -> 00001010&00000001 //5th left bit is checked TestBit(01010101,2) -> 00010101&00000001 //6th left bit is checked TestBit(01010101,1) -> 00101010&00000001 //7th left bit is checked TestBit(01010101,0) -> 01010101&00000001 //8th left bit is checked
Convert decimal number to binary number – a function that writes an integer to a string void binary(int num, char* st, int size) { int i, mask=1; for(i=size-2; i>=0; i--) if(num&mask) st[i]='1'; else st[i]='0'; mask<<=1; // move the mask one bit left st[size-1]=‘\0’; }
Convert decimal number to binary number –the program void main() { int num,size=sizeof(int)*8+1; char st[size]; printf("Enter an integer: "); scanf("%d", &num); binary(num,st,size); puts(st); }
Convert decimal number to binary number - numeric example num =29 mask i st 0000000000011101 0000000000000001 31 st[31]="1“ 0000000000011101 0000000000000010 30 st[30]="0" 0000000000011101 0000000000000100 29 st[29]="1“ 0000000000011101 0000000000001000 28 st[28]="1“ 0000000000011101 0000000000010000 27 st[27]=“1“ 0000000000011101 0000000000100000 26 st[26]="0" . st[0]="0"