Как создать функцию, которая работает как побитовый оператор дополнения в C
Мне было поручено создать функцию, которая работает как побитовый оператор дополнения. Пока что я создал вот это:
#include <stdio.h> /** print the binary equivalent of a signed integer value. */ void printBinary(int n){ int i; unsigned k = 1 << 31; for(i = 0; i < sizeof(int) * 8; ++i){ if ((n & (k >> i)) == (k >> i)) printf("1"); else printf("0"); if ( (i+1) % 8 == 0) printf(" "); } putchar('\n'); } /** The function flip receives a signed integer n and inverts every bit of n and returns the inverted integer. That is, it performs equivalent to bitwise complement operator ~. You must not use ~ for doing the function. You must not change the prototype of function flip. You must not change anywhere else of the program apart from developing function flip. */ int flip(int n){ // Your code starts here int i; unsigned int a = 1 << 31; printBinary(n); for(i=0; i< sizeof(int) * 8; i++) { if(n & (a >> i)) n = n & (0 >> i); else n = n | (1 >> i); } printBinary(n); return n; } int main(){ // Do not change anything here. // There are 3 test cases, you need to pass through all of them. // Run the program after completing flip function. int k = 5; int p = flip(k); int count = 0; if (p == -6){ printf("First Test case: Passed\n"); count++; } else{ printf("First Test case: Failed\n"); } p = flip(-1); if (p == 0){ printf("Second Test case: Passed\n"); count++; } else{ printf("Second Test case: Failed\n"); } p = flip(100); if (p == -101){ printf("Third Test case: Passed\n"); count++; } else{ printf("Third Test case: Failed\n"); } // checking if all test cases were passed. if (count == 3){ printf("Well done\n"); } else{ printf("%d out of 3 test cases are passed\n", count); printf("Please recheck your function, you are missing something\n"); } return 0; }
В функции flip я попытался это сделать. Функция работает правильно для переворачивания 1 бита, но она не переворачивает 0 битов. Я не могу его получить. Я использовал побитовый оператор & и|.
Что я уже пробовал:
Я подумал, что это может быть дефект условного оператора if else, поэтому я попытался использовать лестницу if else if, но она не работает.
Richard MacCutchan
Это довольно просто:
IF bit == 1
bit = 0
ELSE
bit = 1
REPEAT
Zeeking99
Это то, что я пытаюсь сделать, но я не могу манипулировать битами индивидуально.
Richard MacCutchan
Почему бы и нет, у вас уже есть код в вашем вопросе, который проверяет наличие установленных битов?
Попробовать это:
unsigned int orig = 0x0F1E3C78;
unsigned int flip = 0;
for (int i = 0; i < 32; ++i)
{
if ((orig & (1 << i)) == 0)
flip = flip + (1 << i);
}
Jochen Arndt
Нет необходимости очищать биты при использовании переменной, инициализированной до нуля, как показано Ричардом. Тогда вам придется устанавливать только биты.
Но есть гораздо более простое решение: использование XOR.
Zeeking99
Да, я понял. Спасибо за помощь.