سؤال

هناك طريقة شائعة تخزين قيم متعددة في متغير واحد باستخدام قناع بت.على سبيل المثال إذا كان المستخدم لديه قراءة وكتابة وتنفيذ امتيازات على البند التي يمكن تحويلها إلى رقم واحد بقوله read = 4 (2^2), write = 2 (2^1), execute = 1 (2^0) ثم مع 7.

يمكنني استخدام هذه التقنية في العديد من التطبيقات على شبكة الإنترنت حيث كنت عادة تخزين متغير في حقل تعطيه نوع من MEDIUMINT أو أيا كان ، اعتمادا على عدد من القيم المختلفة.

ما يهمني هو ما إذا كان أو لم يكن هناك عملية تحديد عدد من القيم يمكنك تخزين مثل هذا ؟ على سبيل المثال ، إذا كان العدد أكثر من 64, لا يمكنك استخدام (64 بت) الأعداد الصحيحة أي أكثر من ذلك.إذا كان هذا هو الحال, ماذا ستختار ؟ كيف تؤثر البرنامج المنطق (أي:أن كنت لا تزال تستخدم المعامل المقارنات)?

وأنا أعلم أنه بمجرد البدء في الحصول على حقا مجموعات كبيرة من القيم ، طريقة مختلفة سيكون الحل الأمثل ، ولكن أنا مهتم في حدود هذا الأسلوب.

هل كانت مفيدة؟

المحلول

من على قمة رأسي, كنت أكتب set_bit و get_bit الوظيفة التي يمكن أن تتخذ مجموعة من بايت قليلا تعويض في مجموعة ، واستخدام بعض الشيء-twiddling مجموعة/الحصول على بت المناسب في الصفيف.شيء من هذا القبيل (في C ، ولكن نأمل أن تحصل على هذه الفكرة):

// sets the n-th bit in |bytes|. num_bytes is the number of bytes in the array
// result is 0 on success, non-zero on failure (offset out-of-bounds)
int set_bit(char* bytes, unsigned long num_bytes, unsigned long offset)
{
  // make sure offset is valid
  if(offset < 0 || offset > (num_bytes<<3)-1) { return -1; }

  //set the right bit
  bytes[offset >> 3] |= (1 << (offset & 0x7));

  return 0; //success 
}

//gets the n-th bit in |bytes|. num_bytes is the number of bytes in the array
// returns (-1) on error, 0 if bit is "off", positive number if "on"
int get_bit(char* bytes, unsigned long num_bytes, unsigned long offset)
{
  // make sure offset is valid
  if(offset < 0 || offset > (num_bytes<<3)-1) { return -1; }

  //get the right bit
  return (bytes[offset >> 3] & (1 << (offset & 0x7));
}

نصائح أخرى

لقد استعملت بعض الأقنعة في الملفات البرمجية حيث قناع بت هو عدد مرات أكبر من آلة كلمة.أعتقد أنه من مثل "مجموعة من القيم المنطقية";

(journalling الأقنعة في ذاكرة فلاش إذا كنت تريد أن تعرف)

العديد من المجمعين تعرف كيف تفعل هذا لك.Adda بعض OO رمز إلى الأنواع التي تعمل senibly ثم الرمز الخاص بك يبدأ يبحث مثل هذا القصد ، وليس بعض الشيء-ضجيجا.

My 2 cents.

مع 64-بت عدد صحيح ، يمكنك تخزين قيم تصل إلى 2^64-1, 64 فقط 2^6.لذا نعم, هناك حد ، ولكن إذا كنت تحتاج إلى أكثر من 64-قيمته من أعلام سأكون مهتما جدا لمعرفة ماذا كانوا يفعلون :)

كيف العديد من الدول لذلك عليك أن يحتمل التفكير ؟ إذا كان لديك 64 إمكانات الدول ، وعدد من مجموعات أنها يمكن أن توجد في كامل بحجم 64-بت عدد صحيح.

إذا كنت بحاجة للقلق حول 128 الأعلام ، ثم زوج من بت ناقلات تكفي (2^64 * 2).

إضافة:في البرمجة اللؤلؤ ، هناك مناقشة مطولة حول استخدام القليل مجموعة من طول 10^7 ، نفذت في الصحيحة (عقد تستخدم أرقام 800) - انها سريعة جدا و مناسبة جدا لهذه المهمة المبينة في هذا الفصل.

بعض اللغات ( أعتقد perl لا غير متأكد ) تصريح أحادي المعامل الحسابي على السلاسل.مما يتيح لك أكبر مجموعة فعالة.( (strlen * 8bit حرف ) تركيبات )

ومع ذلك لا استخدام قيمة واحدة استعلاء من أكثر من /نوع/ من البيانات.الأساسية r/w/س الثلاثي 3-بت رجات ربما يكون الجزء العلوي من "عملية" الحد لا كفاءة مساحة الأسباب ، ولكن عملية التنمية الأسباب.

( Php يستخدم هذا النظام للسيطرة على-رسائل الخطأ, وأنا قد وجدت بالفعل أن قليلا أكثر من الأعلى عندما يكون لديك لتحديد القيم حيث php الثوابت ليست المقيمين لديك لتوليد عدد صحيح من جهة ، و إلى أن نكون صادقين ، إذا chmod لم تدعم 'أوغو+rwx' نمط الجملة كنت لا ترغب في استخدامه لأن أنا لا يمكن أبدا أن تذكر الأرقام السحرية )

لحظة عليك أن الكراك فتح الثوابت الجدول إلى رمز التصحيح كنت أعلم أنك قد ذهب بعيدا جدا.

الموضوع القديم, ولكن من الجدير بالذكر أن هناك حالات تتطلب منتفخة قليلا الأقنعة ، على سبيل المثال ، الجزيئية بصمات الأصابع ، والتي غالبا ما يتم إنشاؤها 1024 بت المصفوفات التي لدينا معبأة في 32 bigint المجالات (SQL Server لا يدعم UInt32).بت الحكمة عمليات تعمل بشكل جيد حتى الجدول الخاص بك يبدأ في النمو و كنت أدرك تباطؤ وظيفة منفصلة المكالمات.البيانات الثنائية نوع العمل ، لولا T-SQL الحظر على جميع مشغلي وجود اثنين الثنائية المعاملات.

على سبيل المثال .صافي يستخدم مجموعة من الاعداد الصحيحه داخلية مساحة التخزين BitArray الدرجة.عمليا لا توجد طريقة أخرى حولها.

أن يقال, في SQL سوف تحتاج أكثر من عمود واحد (أو استخدام النقط) لتخزين جميع الدول.

أنت معلم هذا السؤال SQL, لذا أعتقد أنك بحاجة إلى التشاور مع وثائق قاعدة البيانات الخاصة بك للعثور على حجم عدد صحيح.ثم طرح بت واحد من أجل التوقيع فقط لتكون آمنة.

تحرير: تعليقك يقول انك تستخدم MySQL.وثائق MySQL 5.0 أنواع رقمية تنص على أن الحد الأقصى لحجم الرقمية هو 64 أو 65 أرقام.هذا 212 بت 64 أرقام.

تذكر أن اللغة التي تختارها يجب أن تكون قادرة على العمل مع تلك الأرقام, لذلك قد تكون محدودة إلى 64-بت عدد صحيح على كل حال.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top