فائدة التلاعب بالـ binary بلغة الـ ++C

تم تحميل الصفحة في 0,9421639 ثانية
فائدة التلاعب بالـ binary بلغة الـ ++C

عـبـدالـله

.:: أبو مـحـمـد : مُشرف قسم python ::.
rankrankrankrankrank
إنضم
5 ديسمبر 2013
المشاركات
2,217
الإعجابات
2,860
النقاط
198
السلام عليكم ورحمة الله وبركاته

انا والله مركز كثير على الـ binary لانه قلب البيانات المخزنه بالنظام . وايضآ اهميته بالشبكات .

مثلآ لدي هذي الاكواد

الاول نوعه char

C++:
#include <iostream>

using namespace std;

int main()
{
    char y,n = 1000110;

    y=~n;

    cout << "N: " << n << endl;
    cout << "Y: " << y << endl;

    return 0;
}

والنوع الثاني uint8_t

C++:
#include <iostream>

using namespace std;

int main()
{
    uint8_t y,n = 1000110;

    y=~n;

    cout << "N: " << n << endl;
    cout << "Y: " << y << endl;

    return 0;
}
مع العلم حتى لو قمنا بتحويل uint8_t الى int8_t سيعطي نفس نتيجة الـ char

ملاحظه الفرق بين الـ uint8_t , int8_t

ان الـ int8_t = يبدء من 128- الى 127
والـ uint8_t = يبدء من 0 الى 255


هذا فقط بالمقارنه بـ ~ وتعني not هناك مقارنة بالـ | , & , << , >> , ^ لم اتطرق لها الآن

ايضآ كلها تقارن بين الـ Byte فيما يخص الـ Binary


---

لم اقارن قيمتين فقط مقارنه على بايت واحد فقط

هل هناك اشخاص يهتمون لهذي الامور
 

عـبـدالـله

.:: أبو مـحـمـد : مُشرف قسم python ::.
rankrankrankrankrank
إنضم
5 ديسمبر 2013
المشاركات
2,217
الإعجابات
2,860
النقاط
198
يمكن لم اوصل الفكره جيدآ لكن قم بتجربة الكود التالي حتى تتضح فائدة التلاعب بالـ Binary


C++:
#include <iostream>

using namespace std;

int main()
{
    char a='a',b='b',c;

    c = a + ~b;
    cout << "C: " << c << endl;

    c = ~a + ~b;

    cout << "C: " << c << endl;

    return 0;
}
طبعآ لكل مهتم بالتشفير هذي اهم الطرق التي يجب ان يتعلمها جيدآ

ان شاء الله وصلت الفكره
 

عـبـدالـله

.:: أبو مـحـمـد : مُشرف قسم python ::.
rankrankrankrankrank
إنضم
5 ديسمبر 2013
المشاركات
2,217
الإعجابات
2,860
النقاط
198
تخيل معي هذا الكود بمقارنة وبحسبة عدد كبير بسبب التحويل الى length

C++:
#include <iostream>

using namespace std;

int main()
{
  string User[] = {"Abdullah","Khaled","Naser"};
  for(string i : User)
  {
 
      cout << User[~i.length()]  << endl;
      cout << "\n" << endl;
  }

    return 0;
}



مع العلم لو قمنا بتحويل النصوص الى int نراه كما بالصوره التاليه .




السبب لأنني اقارن بين الـ bit والاخر ظهر لي هذا الكود الطويل الذي بالاعلى .


وهذا للـ char

C++:
#include <iostream>

using namespace std;

int main()
{

    char chr[] = {'a','b','c','d','e'};

    for(char ch : chr)

    {

        int i = char(~ch);

        cout << char(i)  << endl;

        cout << "\n" << endl;

    }

    return 0;
}



هذا كله بالمقارنه ~ مايعني Not فقط .
 
إنضم
27 يناير 2018
المشاركات
578
الإعجابات
522
النقاط
93
تخيل معي هذا الكود بمقارنة وبحسبة عدد كبير بسبب التحويل الى length

C++: ?12345678910111213141516#include <iostream> using namespace std; int main(){ string User[] = {"Abdullah","Khaled","Naser"}; for(string i : User) { cout << User[~i.length()] << endl; cout << "\n" << endl; } return 0;}


مع العلم لو قمنا بتحويل النصوص الى int نراه كما بالصوره التاليه .




السبب لأنني اقارن بين الـ bit والاخر ظهر لي هذا الكود الطويل الذي بالاعلى .


لا طبعا مع أنني لا أعرف كثيرا في الباينري والبت لأني لا أستخدمه كثيرا
لكن سبب االناتج الطويل بالأعلي هو أنك دخلت علي مكان خاطئ في الذاكرة

لأن أولا أنت تدخل ترتيب غلط في المصفوفة يعني غالبا تحص علي كراش
ثانيا أنت تدخل ترتيب بعيد جدا لأن length() في string ترجع size_t وعندما تعكسه أظن الناتج يطلع سالب
ولأن النوع unsigned فمعناه إنك بدأت من أكبر قيمة لهذا النوع وانت نازل

وعندما يصل هذا العنوان إلي معامل << في cout سيعامله علي أنه نص string
و كلاس string غالبا من مؤشر إلي نص و رقم للحجم ومصفوقة صغيرة علي المكدس
ولأن المؤشر هنا يشير إلي مكان إشارة عشواء والحجم أيضا له أي قيمة موجودة في الذاكرة
فسيظل cout يكتب ما يجده في هذا الحيز وغالبا سيصل إلي ذاكرة غير محجوزة ويتوقف البرنامج عن العمل


أما في الأرقام فنفس الأمر لكن أقصي رقم في نظام 64-bit حجمه 8 byte = 64 bit
لذا سيطبع رقم بطريقة عشواء لأول 8 بايت يشير إليه العنوان

والكود أول ما شغلته عندي طبع شوية وتوقف عن العمل
 

عـبـدالـله

.:: أبو مـحـمـد : مُشرف قسم python ::.
rankrankrankrankrank
إنضم
5 ديسمبر 2013
المشاركات
2,217
الإعجابات
2,860
النقاط
198
لا طبعا مع أنني لا أعرف كثيرا في الباينري والبت لأني لا أستخدمه كثيرا
لكن سبب االناتج الطويل بالأعلي هو أنك دخلت علي مكان خاطئ في الذاكرة

لأن أولا أنت تدخل ترتيب غلط في المصفوفة يعني غالبا تحص علي كراش
ثانيا أنت تدخل ترتيب بعيد جدا لأن length() في string ترجع size_t وعندما تعكسه أظن الناتج يطلع سالب
ولأن النوع unsigned فمعناه إنك بدأت من أكبر قيمة لهذا النوع وانت نازل

وعندما يصل هذا العنوان إلي معامل << في cout سيعامله علي أنه نص string
و كلاس string غالبا من مؤشر إلي نص و رقم للحجم ومصفوقة صغيرة علي المكدس
ولأن المؤشر هنا يشير إلي مكان إشارة عشواء والحجم أيضا له أي قيمة موجودة في الذاكرة
فسيظل cout يكتب ما يجده في هذا الحيز وغالبا سيصل إلي ذاكرة غير محجوزة ويتوقف البرنامج عن العمل


أما في الأرقام فنفس الأمر لكن أقصي رقم في نظام 64-bit حجمه 8 byte = 64 bit
لذا سيطبع رقم بطريقة عشواء لأول 8 بايت يشير إليه العنوان

والكود أول ما شغلته عندي طبع شوية وتوقف عن العمل
نعم تخطى المسموح به واصبح overflow واصبح فوق حجمه الـ byte

لانني لم اقم بتقسيم الرقم الى bit بالشكل المطلوب تخطى الـ 255 وهذا بسبب عدم التقسيم .


تركت كل شيء وركزت على هذا .؟
 
إنضم
27 يناير 2018
المشاركات
578
الإعجابات
522
النقاط
93
نعم تخطى المسموح به واصبح overflow واصبح فوق حجمه الـ byte

لانني لم اقم بتقسيم الرقم الى bit بالشكل المطلوب تخطى الـ 255 وهذا بسبب عدم التقسيم .


تركت كل شيء وركزت على هذا .؟
أقصد هذا السطر
C++:
cout << User[~i.length()]  << endl;
الترتيب لا بد أن يكون 0 أو 1 أو 2 وإلا فستحصل علي ما يسمونه undefined behavior
يعني غالبا كراش أو أسوأ منه heap corruption

في لفات أخري ستحصل علي out of range exception

للتوضيح أكثر

C++:
for (string i : User)
{
    auto index = ~i.length();
    cout << "[!] warning index is : " << index << " which is far bigger than 2" << endl;
    cout << User[index] << endl; // out of range
    cout << "\n" << endl;
}
 

عـبـدالـله

.:: أبو مـحـمـد : مُشرف قسم python ::.
rankrankrankrankrank
إنضم
5 ديسمبر 2013
المشاركات
2,217
الإعجابات
2,860
النقاط
198
طيب لي رجعه ان شاء الله حاليآ سأنتقل لشقه اخرى وبرجع للموضوع

مع العلم لم اركز بهذا الموضوع جيدآ لانني كتبته بعجاله مع السهر وقلة النوم

سأقوم بترتيبه اكثر مع اضافة صور حتى يتضح اكثر والفائده تعم الجميع ان شاء الله .

بارك الله فيك اخي يوسف خطئ بسيط سبب كارثه .

لي رجعه .
 

الأعضاء النشطين حاليآ الذين يشاهدون هذا الموضوع (1 عضو و 0 ضيف)

خيارات الاستايل

نوع الخط
مودك
اخفاء السايدر بار OFF
توسيط المنتدى OFF
فصل الأقسام OFF
الأقسام الفرعية OFF
عرض المشاركات
حجم الخط
معلومات العضو OFF
إخفاء التوقيع OFF

إرجاع خيارات الإستايل