كيف يمكنني ضبط جميع البتات على "1" في رقم ثنائي بحجم غير معروف؟

StackOverflow https://stackoverflow.com/questions/818535

  •  03-07-2019
  •  | 
  •  

سؤال

أحاول كتابة دالة في التجميع (لكن لنفترض أن اللغة غير محددة للسؤال).

كيف يمكنني استخدام معاملات البت لتعيين كافة البتات التي تم تمريرها إلى 1؟

أعلم أنه يمكنني استخدام "أو" مع قناع مع البتات التي أرغب في تعيينها، لكنني لا أعرف كيفية إنشاء قناع يعتمد على عدد ثنائي من حجم N.

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

المحلول

و~ (س & 0)

س & 0 سيؤدي دائما في 0، و ~ وانعكاس كافة البتات إلى 1S.

نصائح أخرى

وتعيين إلى 0، ثم انعكاس كافة البتات إلى 1 مع أحادي المعامل-NOT.

ستجد ذلك في لغة التجميع يملك لمعرفة حجم "الرقم الذي تم تمريره".وفي لغة التجميع هذا مهم حقًا أي آلة لغة التجميع مخصصة لـ.

وبالنظر إلى هذه المعلومات، قد تسأل أيضًا

  • كيف أقوم بتعيين تسجيل عدد صحيح لجميع البتات 1؟

أو

  • كيف يمكنني ملء منطقة في الذاكرة بكل البتات الواحدة؟

لملء السجل بجميع البتات الواحدة، تتطلب الطريقة الفعالة في معظم الأجهزة تعليمتين:

  1. امسح السجل باستخدام تعليمات واضحة لغرض خاص، أو قم بتحميل 0 على الفور، أو xأو السجل مع نفسه.

  2. خذ تكملة السجل.

يتطلب ملء الذاكرة بـ 1 بت تعليمات تخزين واحدة أو أكثر...

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

ومجموعة س إلى 1

وبينما س <رقم   س = س * 2

الإجابة = عدد أو س - 1

والرمز يفترض يسمى الإدخال "الرقم". يجب أن تعمل بشكل جيد للقيم الإيجابية. ملاحظة للقيم السالبة التي هي متمم ثنائي محاولة عملية لا معنى له كما بت عالية سوف يكون دائما واحدة.

وتعيين إلى -1. وعادة ما يمثل ذلك من خلال كل بت يجري 1.

استخدم T(~T(0)).

وأين T هو على TypeName (إذا كنا نتحدث عن C ++).

وهذا يمنع الترويج غير المرغوب فيها إلى int إذا كان نوع أصغر من int.

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