चुनौती
एक फ़ंक्शन को लागू करें जो दो पूर्णांकों को स्वीकार करता है जिनके मान 0 से 255 तक होते हैं और उन पूर्णांकों के योग को 256 प्रतिफल देता है। आप केवल बिटवाइज़ निगेटिव (~), बिटवाइज़ या (!), बिट शिफ्टिंग ऑपरेटर (>>, <<) का उपयोग कर सकते हैं। , और असाइनमेंट (=)।
जिन चीजों का आप उपयोग नहीं कर सकते हैं (लेकिन वे सीमित नहीं हैं)
- जोड़, घटाव, गुणा और भाग
- लूप्स
- सशर्त बयान
- फंक्शन कॉल
द्विआधारी या बाइनरी नकार का सबसे अच्छा उपयोग करता है, और बिट शिफ्ट ऑपरेशन जीतता है । एक टाई की स्थिति में, सबसे लोकप्रिय समाधान जीतता है। हमेशा की तरह, मानक खामियां लागू होती हैं।
यहाँ एक सरल 2-बिट योजक का एक उदाहरण है। यह 77 द्विआधारी नकारात्मक, 28 द्विआधारी अयस्कों, और 107 के कुल स्कोर के लिए 2 बिट-शिफ्ट का उपयोग करता है (इसे सी प्रीप्रोसेसर के साथ चलाकर देखा जा सकता है gcc -E
)। यह #define
एस को हटाकर और परिणामी अभिव्यक्तियों को सरल करके बहुत अधिक कुशल बनाया जा सकता है , लेकिन मैंने उन्हें स्पष्टता के लिए छोड़ दिया है।
#include <stdio.h>
#define and(a, b) (~((~a)|(~b)))
#define xor(a, b) (and(~a,b) | and(a,~b))
int adder(int a, int b)
{
int x, carry;
x = xor(and(a, 1), and(b, 1));
carry = and(and(a, 1), and(b, 1));
carry = xor(xor(and(a, 2), and(b, 2)), (carry << 1));
x = x | carry;
return x;
}
int main(int argc, char **argv)
{
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (adder(i, j) != (i + j) % 4) {
printf("Failed on %d + %d = %d\n", i, j, adder(i, j));
}
}
}
}
अद्यतन: उदाहरण और जोड़ा स्कोरिंग critera बदल दिया है