أداة NAND الثنائية
تنفيذ عملية NAND على رقمين ثنائيين
جرب الأداة
مقدمة
أداة NAND الثنائية تنفذ عملية NAND (NOT AND) على رقمين ثنائيين. تُرجع NAND 0 فقط عندما يكون كلا البتات المقابلة 1، وإلا تُرجع 1. إنها عكس عملية AND.
كيفية الاستخدام
- أدخل الرقم الثنائي الأول في حقل الإدخال
- أدخل الرقم الثنائي الثاني في حقل الإدخال
- انقر فوق "حساب" لتنفيذ عملية NAND
- عرض النتيجة بتنسيقات ثنائية وعشرية
- نسخ النتيجة باستخدام زر النسخ
حالات الاستخدام
- عملية NAND: 1010 NAND 1100 = 0111 (7 بالعشري)
- NAND مكتمل وظيفيًا (يمكنه تنفيذ أي دالة منطقية)
- استخدام في تصميم الدوائر الرقمية والبوابات المنطقية
- شائع في تصميم الأجهزة وهندسة الكمبيوتر
نصائح
- عملية NAND: 1 NAND 1 = 0, 1 NAND 0 = 1, 0 NAND 1 = 1, 0 NAND 0 = 1
- NAND هو عكس AND: NAND(A, B) = NOT(AND(A, B))
- بوابات NAND عالمية (يمكنها بناء أي دائرة منطقية)
- يستخدم عادة في ذاكرة الفلاش والإلكترونيات الرقمية
ما هو أداة NAND الثنائية؟
آلة حساب NAND الثنائية (NOT-AND) تحسب نفي AND على مستوى البت: كل بت ناتج يكون 0 إذا كان كلا البتين المدخلين 1، وإلا 1. رسمياً، NAND(a, b) = ~(a & b). على سبيل المثال، NAND(0b1100, 0b1010) = ~(0b1000) = 0b0111 (باعتبار 4 بتات). في JavaScript، لا يوجد عامل NAND مباشر - تكتب `~(a & b)`. تشتهر NAND في المنطق الرقمي كبوابة شاملة: يمكن بناء أي دالة بولية (AND, OR, NOT, XOR, multiplexer, adder، وحتى وحدات CPU كاملة) من بوابات NAND وحدها. هذه الخاصية (الاكتمال الوظيفي) هي السبب في أن دوائر IC المتخصصة في NAND مثل 7400 أصبحت أساسية في الإلكترونيات الرقمية المبكرة. ذاكرة NAND flash، المستخدمة في SSDs ومحركات USB، تستخدم بوابات NAND كخلية تخزين أساسية - ترانزستور ببوابة عائمة يحبس الإلكترونات لتمثيل 0 أو 1. في حسابات JavaScript للأعداد الصحيحة ذات الإشارة 32 بت، ينتج NAND عبر `~(a & b)` نتيجة بإشارة: NAND(0xFFFFFFFF, 0xFFFFFFFF) = ~0xFFFFFFFF = 0 (لأن ~(2^32 - 1) = 0 في 32 بت). لـ NAND على مستوى البت بقناع واحد كطريقة لـ "مسح جميع البتات ما عدا هذه"، استخدم `~(value & ~mask)`. NAND هو المكمل الطبيعي لـ AND ويظهر في أنظمة الأذونات المنفية: NAND(read, write) = "ليس (read AND write)" = "يفتقد على الأقل واحداً من read أو write".
حالات الاستخدام الشائعة
محاكاة المنطق الرقمي
عند محاكاة أو تدريس الدوائر الرقمية في البرمجيات، NAND هو لبنة البناء المفضلة لأنه مكتمل وظيفياً. يمكن بناء نصف جامع من 5 بوابات NAND، وجامع كامل من 9، ومزلاج SR من 2 (متقاطعين). لغات وصف الأجهزة (Verilog, VHDL) غالباً ما تولّف المنطق المعقد إلى أشكال NAND-NAND أو NOR-NOR لأنها ترسم مباشرة إلى سيليكون CMOS. تتيح آلة حساب NAND للطلاب التحقق من جداول الحقيقة وللمهندسين مراجعة مخرجات التوليف قبل tape-out.
منطق نفي الأذونات
في أنظمة RBAC، يعبر NAND عن "NOT (يملك كل هذه الأذونات)" - مفيد للبوابات التي يجب أن تظهر فقط عندما يفتقد المستخدم لقدرة واحدة على الأقل. مثلاً، يظهر زر "طلب وصول إضافي" عندما يكون NAND(PERMISSION_A, PERMISSION_B) صحيحاً - أي أن المستخدم يفتقد واحداً على الأقل من الاثنين. التأطير الصديق للمستخدم هو "تحتاج إلى كل من A و B لإخفاء هذا التنبيه"، وهو بالضبط دلالات NAND.
محاكاة ذاكرة NAND Flash
تخزّن NAND flash البيانات في خلايا تُبرمج بحبس الإلكترونات في بوابة عائمة. تُقرأ الخلية كـ 1 عند عدم البرمجة وكـ 0 عند البرمجة - عكس NOR flash. البرمجيات التي تحاكي NAND flash (لاختبار firmware في CI، أو لـ SSD controllers) تنمذج كل صفحة كـ bitmap وتطبق عمليات NAND لمحاكاة wear-leveling وbit-rot وتمييز البلوكات السيئة. فهم دلالات NAND ضروري لمهندسي التخزين المدمج.
أمثلة على الكود
تنفيذ NAND وجدول الحقيقة
يُنفَّذ NAND كـ `~(a & b)` - إجراء AND على القيم ثم عكس جميع البتات. جدول الحقيقة أحادي البت هو عكس AND: 1 إلا عندما يكون كلا المدخلين 1. للعمليات متعددة البتات، يطبق NAND نفس المنطق لكل موضع بت. النتيجة بشكل طبيعي موقعة في JavaScript (لأن ~ ينتج عدداً صحيحاً موقّعاً 32 بت)، لذا استخدم `& 0xF` أو `& 1` لفحص البتات المحددة.
// NAND は NOT-AND: ~(a & b)
function nand(a: number, b: number): number {
return ~(a & b);
}
// 真理表(1ビット)
console.log(nand(0, 0).toString(2)); // -1 (= ~0 = 32ビットで全1)
console.log(nand(0, 1).toString(2)); // -1
console.log(nand(1, 0).toString(2)); // -1
console.log(nand(1, 1).toString(2)); // -2 (= ~1 = ...11111110)
// 1ビット真理表には1ビットにマスク
console.log(nand(0, 0) & 1); // 1
console.log(nand(0, 1) & 1); // 1
console.log(nand(1, 0) & 1); // 1
console.log(nand(1, 1) & 1); // 0 (1 NAND 1 = 0 のみ)
// マルチビット: NAND(0b1100, 0b1010) = ~(0b1000) = ...11110111
console.log((nand(0b1100, 0b1010) & 0xF).toString(2).padStart(4, '0')); // "0111"بناء أي بوابة من NAND (الاكتمال الوظيفي)
يُظهر هذا الاكتمال الوظيفي لـ NAND: يمكن التعبير عن NOT وAND وOR و XOR باستخدام NAND وحده. NOT هو NAND(a, a) (a مع NAND لنفسه). AND هو NAND مزدوج. OR يستخدم قانون دي مورغان: A OR B = NOT(NOT A AND NOT B). لهذا يمكن بناء الشرائح المادية من بوابات NAND فقط - أساس عائلات منطق TTL المبكرة مثل 7400.
// NAND は関数的に完全 - 任意のゲートを構築可能
const nand = (a: number, b: number) => (~ (a & b)) & 1; // 1ビット NAND
// NAND から NOT: NAND(a, a)
const not = (a: number) => nand(a, a);
// NAND から AND: NOT(NAND(a, b)) = NAND(NAND(a,b), NAND(a,b))
const and = (a: number, b: number) => nand(nand(a, b), nand(a, b));
// NAND から OR: NAND(NOT(a), NOT(b)) = NAND(NAND(a,a), NAND(b,b))
const or = (a: number, b: number) => nand(nand(a, a), nand(b, b));
// NAND から XOR(4ゲート)
const xor = (a: number, b: number) => {
const t = nand(a, b);
return nand(nand(a, t), nand(b, t));
};
console.log('NOT(0):', not(0), 'NOT(1):', not(1));
console.log('AND(1,1):', and(1,1), 'AND(1,0):', and(1,0));
console.log('OR(0,1):', or(0,1), 'OR(0,0):', or(0,0));
console.log('XOR(1,0):', xor(1,0), 'XOR(1,1):', xor(1,1));أفضل الممارسات
- ✓نفّذ NAND كـ `~(a & b)` - هذا هو التعريف الرياضي المباشر. لدلالات 1 بت، قنّع النتيجة بـ `& 1` للتخلص من البتات العليا الممتدة بالإشارة.
- ✓عند بناء الدوائر من NAND في المحاكاة، تذكر أن NAND مكتمل وظيفياً - يمكنك بناء أي دالة بولية من NAND وحده، وهو أساس شرائح المنطق الرقمي المبكرة مثل 7400.
- ✓وثّق ما إذا كنت تقصد NAND على مستوى البت (عملية لكل بت على الأعداد الصحيحة) أو NAND المنطقي (نتيجة بولية مفردة) - الاثنان مرتبطان لكن مختلفان، و JavaScript يخلط بينهما عبر الإكراه 32 بت.
- ✓لأنظمة الأذونات، NAND(read, write) تعني "يفتقد على الأقل واحداً من read أو write" - مفيد للبوابات التي تتطلب كلا الإذنين للكبت.
- ✓عند محاكاة ذاكرة NAND flash، تذكر أن الخلايا تُقرأ كـ 1 عند عدم البرمجة وكـ 0 عند البرمجة - عكس دلالات "1 = مخزّن" البديهية.
أخطاء شائعة يجب تجنبها
- ✗نسيان أن `~` في JavaScript ينتج عدداً صحيحاً موقّعاً 32 بت - NAND(1, 1) يعيد -2 (ليس 0xFE أو 254) لأن البتات العليا كلها 1. استخدم `& 1` لدلالات 1 بت.
- ✗الخلط بين NAND (على مستوى البت) و NOT-AND المنطقي (بولي مفرد). يُعيد `nand(0b1100, 0b1010)` قيمة متعددة البتات (0b...0111)، لا بولي مفرد.
- ✗افتراض أن NAND تجميعي أو إبدالي بأشكال مفيدة - NAND(a, b) === NAND(b, a) (إبدالي)، لكن NAND(NAND(a, b), c) ليست نفس NAND(a, NAND(b, c)) (غير تجميعي).
- ✗بناء دائرة من بوابات NAND ونسيان أن بوابات NAND الحقيقية لها تأخير انتشار - محاكاة البرمجيات تتخطى هذا غالباً، مسببة ظروف سباق عند النقل إلى السيليكون.
- ✗الخلط بين NAND flash (الخلايا تُقرأ كـ 1 عند عدم البرمجة) و NOR flash (الخلايا تُقرأ كـ 1 عند البرمجة) - الأسماء تشير إلى طوبولوجيا البوابة، لا اتفاقية البيانات، لكن اتفاقية البيانات تختلف.
عمليات البحث ذات الصلة
الأدوات الموصى بها
أداة AND الثنائية
تنفيذ عملية AND على رقمين ثنائيين
أداة OR الثنائية
تنفيذ عملية OR على رقمين ثنائيين
أداة XOR الثنائية
تنفيذ عملية XOR على رقمين ثنائيين
أداة NOT الثنائية
تنفيذ عملية NOT على رقم ثنائي
أداة NOR الثنائية
تنفيذ عملية NOR على رقمين ثنائيين
أداة XNOR الثنائية
تنفيذ عملية XNOR على رقمين ثنائيين