Ввести числа X и Y (0 <=X,Y<= 255). Вычислить, не используя арифметические операции, сумму остатка от деления X на 8 и наибольшего числа, кратного 8, не превосходящего Y .
Dunvil, #include <stdio.h> #include <stdlib.h> int main() { int x, y, balance = 0; scanf("%d", &x); scanf("%d", &y); int f = (x >> 3) << 3; if (f != x) { balance = x & ~f; } printf("Остаток: %d\nСамое большое число кратное 8-ми: %d", balance, x & f); } C #include <stdio.h> #include <stdlib.h> int main() { int x, y, balance = 0; scanf("%d", &x); scanf("%d", &y); int f = (x >> 3) << 3; if (f != x) { balance = x & ~f; } printf("Остаток: %d\nСамое большое число кратное 8-ми: %d", balance, x & f); }
#include <iostream> using namespace std; // Возвращает сумму a и b используя побитовый // операторы. int sum(int a, int b) { int s = a ^ b; int carry = a & b; if (carry == 0) return s; else return sum(s, carry << 1); } int main(int argc, char const *argv[]) { int x, y; cin >> x >> y; // Остаток от деления a ≥ 0 на 2^n можно получить, выделив младшие биты (которые пропали бы при сдвиге вправо) с помощью соответствующей маски: a & ((1 << n) - 1) int rem = x & 7 /* ((1 << 3) - 1) */; int num = (y >> 3) << 3; // Наибольшее число, не превосходящее y, кратное восьми cout << sum(rem, num); return 0; } C #include <iostream> using namespace std; // Возвращает сумму a и b используя побитовый // операторы. int sum(int a, int b) { int s = a ^ b; int carry = a & b; if (carry == 0) return s; else return sum(s, carry << 1); } int main(int argc, char const *argv[]) { int x, y; cin >> x >> y; // Остаток от деления a ≥ 0 на 2^n можно получить, выделив младшие биты (которые пропали бы при сдвиге вправо) с помощью соответствующей маски: a & ((1 << n) - 1) int rem = x & 7 /* ((1 << 3) - 1) */; int num = (y >> 3) << 3; // Наибольшее число, не превосходящее y, кратное восьми cout << sum(rem, num); return 0; }
kekuz, Функцию суммы честно украл отсюда: http://espressocode.top/how-to-sum-two-integers-without-using-arithmetic-operators-in-cc/