Что значит данный кусок кода,нигде не могу найти информации!

Добрый день уважаемые пользователи,в общем задача была такая: Если все нечетные биты числа типа unsigned равняются единицам,вывести один,иначе ноль

Например: битовое представление числа "10"="1010",все нечетные биты здесь-единицы => ответ 1.

Изначально дана функция,принимающая один параметр:

int any_odd(unsigned x) {
 //Ваш код.
}

Скажите пожалуйста,что делает данный кусок кода:

int any_odd(unsigned x)
 {
  return x & 2863311530 ? 1 : 0;
 } 

Также есть такой вариант:

int any_odd(unsigned x) {
  return (x & 0xAAAAAAAA) ? 1 : 0;
} 

Непонятны именно условия:

x & 2863311530
(x & 0xAAAAAAAA)

Заранее огромное спасибо!!


Ответы (1 шт):

Автор решения: Harry

Ерунду он делает :)

Он, если установлен хоть один нечетный бит, возвращает 1, иначе 0.

2863311530 в бинарном виде равно 10101010101010101010101010101010

Дальше понятно: если установлен в 1 хоть один нечетный бит в числе x, значение x&0xAAAAAAAA будет ненулевым (он даст 1 в результат). Четные биты обнулятся.

Правильнее - если и в самом деле нужны ВСЕ нечетные биты - написать

rerturn x&0xAAAAAAAA == 0xAAAAAAAA;

Но это относится только к 32-разрядным числам. Если вы хотите игнорировать все нулевые биты перед первым единичным битом числа - т.е. чтобы, скажем, 101010 проходило проверку, а 100010 - нет, то тут немного сложнее. Простейший вариант - просто циклически выполнять сдвиги на 2 разряда вправо с проверкой установленности очередного нечетного бита.

→ Ссылка