Как найти четность элемента

How can I find even or odd in array?

        int size;
        int[] myArray = new int[10];

        Scanner input = new Scanner(System.in);

        System.out.print("How many numbers do you enter:");
        size = input.nextInt();

        for(int c = 0; c < size; c++)
        {           
            System.out.print("Enter number:");      
            myArray[c] = input.nextInt();
        }

        input.close();

        for(int c = 0; c < size; c++)
        {           
            System.out.println(myArray[c]);     
        }

        if(size%2)
        {
            System.out.print("sadsadsad");
        }
   }
}

halfer's user avatar

halfer

19.8k17 gold badges98 silver badges185 bronze badges

asked Jul 14, 2015 at 10:31

Jhon Alulod's user avatar

2

Use modulus operator to check if the number is even or odd. If we divide any number by 2 and reminder is 0 then the number is even, otherwise it is odd.

  for(int i=0; i < numbers.length; i++){

      if(numbers[i]%2 == 0)
          System.out.println(numbers[i] + " is even number.");
      else
          System.out.println(numbers[i] + " is odd number.");

  }

answered Jul 14, 2015 at 10:38

Anilkumar Bathula's user avatar

you can check whether a number is even or odd

if((x%2)==0)
   // even
else
   // odd

or

You can use the modulus operator, but that can be slow. If it’s an integer, you can do:

if ( (x & 1) == 0 ) { even... } else { odd... }  

here is your edited code

for(int c = 0; c < size; c++)
        {           
            if(myArray[c]%2==0)//check num is even or odd
            System.out.println(myArray[c]+" even");   
            else
            System.out.println(myArray[c]+" even");  
        }

answered Jul 14, 2015 at 10:35

SatyaTNV's user avatar

SatyaTNVSatyaTNV

4,1273 gold badges15 silver badges31 bronze badges

0

Why do you want to check with the size?

Is that you want to check that if the length of the array is odd or even?

If you want the odd and even numbers in an array, you need to check it with each element in the for loop itself.

for(int c = 0; c < size; c++)
 {   
    if(myarray[c]%2 == 0)
    {
        System.out.print(myarray[c] + " is even");
    }            
    else
    {
     System.out.print(myarray[c] + " is odd");    
    }
}

Edit
A better way to find even or odd is to check only the last number.

We know that if the last digit is divisible by 2 then it is an even else it is an odd.

So If you want to check, we just check the last digit instead of using the % operator for the whole number.

 for(int c = 0; c < size; c++)
     {   
        if(isEven(myarray[c]))
        {
            System.out.print(myarray[c] + " is even");
        }            
        else
        {
         System.out.print(myarray[c] + " is odd");    
        }
    }

public boolean isEven(int number)
{
 return (number%10) % 2 == 0;//number % 10 gets the last digit, checks if it is divisible by 2 or not
}

answered Jul 14, 2015 at 10:35

Uma Kanth's user avatar

Uma KanthUma Kanth

5,6592 gold badges20 silver badges41 bronze badges

0

Нахождение четных элементов массива

Итак формулировка задачи такова «найти все четные элементы массива, вывести на экран, и подсчитать их количество».
Для начала определим, что такое четное число вообще? правильно, четными числами называются числа, которые делятся на 2 без остатка (иногда еще говорят кратны 2).

Теперь определимся как это реализовать. В паскале есть такой замечательный оператор mod, который нам как раз и необходим. Сей оператор отвечает за деление с остатком, а если быть точнее, применив данный оператор, вы получаете остаток от деления. Например 11 разделить на 2. Использовав mod мы получим в ответе число 1.

11/2 = 5 (остаток 1)

Теперь как это все записать в паскале. Пусть переменная х — это остаток

x := 11 mod 5

Вернемся к нашей задаче, где нас интересует нахождение четных элементов массива. Для ее решения нужно подойти к составлению кода логически .
Каков остаток при делении четного числа на 2? Верно, остаток всегда равен нулю. (Подробнее о четности вы можете прочесть в статье оператор div и оператор mod) То есть нам просто нужно использовать цикл с условием вида

if s[i] mod 2 = 0 then

Ну а теперь код всей задачи (как в помните нам еще было необходимо подсчитать количество четных чисел и вывести их всех на экран)

var i,x,y:integer;s:array [1..10] of integer;
begin
for i:=1 to 10 do
read(s[i]);
for i:=1 to 10 do
if s[i] mod 2=0 then begin
writeln (s[i]);
y:=y+1;
end;
writeln;
writeln(‘количество четных чисел = ‘,y)
end.

Печать четных и нечетных чисел из списка Python — хорошее упражнение, если вы только начинаете работать с Python и хотите изучить его основы.

Чтобы извлечь четные и нечетные числа из списка Python, вы можете использовать цикл for и оператор Python по модулю. Второй вариант — заменить цикл for на понимание списка. Расширенный синтаксис оператора среза также позволяет нам делать это с помощью одной строки кода, но только тогда, когда у вас есть списки последовательных чисел.

В этом руководстве мы рассмотрим несколько примеров, и цель реализации нескольких способов решения одной и той же проблемы — развить творческий потенциал, необходимый вам как разработчику Python.

Давайте начнем!

Как вывести нечетные числа из списка в Python?

Чтобы вывести нечетные числа из списка чисел, вы можете использовать оператор Python по модулю, связанный с математической концепцией остатка.

При делении нечетного числа на 2 остаток от деления равен 1. При делении четного числа на 2 остаток от деления равен 0.

Давайте воспользуемся этой концепцией и циклом Python for для вывода нечетных чисел из списка.

def get_odd_numbers(numbers):
    odd_numbers = []
    for number in numbers:
        if number % 2 == 1:
            odd_numbers.append(number)
    return odd_numbers

Перед запуском цикла for мы определяем пустой список, затем на каждой итерации цикла for мы добавляем в список нечетные числа.

numbers = [2, 3, 6, 8, 13, 45, 67, 88, 99, 100]
print(get_odd_numbers(numbers))
[output]
[3, 13, 45, 67, 99]

Как вывести четные числа из списка в Python?

Это очень похоже на то, что мы видели в предыдущем разделе …

Чтобы вывести четные числа из списка чисел, мы можем извлечь числа, которые при делении на 2 возвращают остаток, равный 0.

Код идентичен тому, который мы создали для извлечения нечетных чисел с небольшой разницей в условии if внутри цикла for.

def get_even_numbers(numbers):
    even_numbers = []
    for number in numbers:
        if number % 2 == 0:
            even_numbers.append(number)
    return even_numbers

И результат функции …

numbers = [2, 3, 6, 8, 13, 45, 67, 88, 99, 100]
print(get_even_numbers(numbers))
[output]
[2, 6, 8, 88, 100]

Как создать функцию, разделяющую четные и нечетные числа в списке

Чтобы разделить нечетные и четные числа в списке, мы могли бы использовать тот же подход, основанный на цикле for, который использовался ранее, и сгенерировать два разных списка, один для нечетных и один для четных чисел.

Вместо этого я хочу сделать наш код более кратким, используя понимание списков.

Мы по-прежнему будем использовать понятие остатка …

Давайте создадим базовую функцию, которая принимает список в качестве аргумента и возвращает два списка, один из которых содержит нечетные числа, а другой — четные.

def split_list_even_odd(numbers):
    odd_numbers = [number for number in numbers if number % 2 == 1]
    even_numbers = [number for number in numbers if number % 2 == 0]
    return odd_numbers, even_numbers

Обратите внимание, что эта функция возвращает два списка Python.

Вы знаете, в каком формате эти списки получает вызывающий функцию?

Давайте разберемся…

numbers = [2, 3, 6, 8, 13, 45, 67, 88, 99, 100]
print(split_list_even_odd(numbers))
[output]
([3, 13, 45, 67, 99], [2, 6, 8, 88, 100])

Вызывающая функция получает кортеж с двумя элементами. Мы можем получить доступ к каждому из них, используя квадратные скобки и индекс.

print("The odd numbers are {}".format(split_list_even_odd(numbers)[0]))
print("The even numbers are {}".format(split_list_even_odd(numbers)[1]))
[output]
The odd numbers are [3, 13, 45, 67, 99]
The even numbers are [2, 6, 8, 88, 100]

Если вы хотите узнать больше о синтаксисе .format (), используемом в операторе печати, вы можете взглянуть на этот учебник по объединению строк Python.

Программа для печати четных и нечетных чисел от 1 до 100

Чтобы напечатать четные и нечетные числа от 1 до 100, мы могли бы сначала создать наш список чисел вручную, но это займет много времени!

Вместо этого мы будем использовать функцию Python range ().

Вот как вы можете генерировать числа от 1 до 100 с помощью функции Python range ().

>>> numbers = range(1,101)
>>> print(type(numbers))
<class 'range'>

Интересно, что тип объекта, возвращаемого функцией range (), не является списком.

Итак, что мы можем с этим сделать?

Мы все еще можем использовать цикл for или понимание списка, чтобы просмотреть все числа …

>>> [number for number in numbers]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]

Используйте созданную нами ранее функцию для печати четных и нечетных чисел.

def split_list_even_odd(numbers):
    odd_numbers = [number for number in numbers if number % 2 == 1]
    even_numbers = [number for number in numbers if number % 2 == 0]
    return odd_numbers, even_numbers

numbers = range(1,101)
print("The odd numbers are {}".format(split_list_even_odd(numbers)[0]))
print("The even numbers are {}".format(split_list_even_odd(numbers)[1]))
[output]
The odd numbers are [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99]
The even numbers are [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100]

Как вывести нечетные числа из списка последовательных чисел в Python?

Самый простой способ распечатать нечетные числа из списка последовательных чисел — использовать расширенный синтаксис оператора среза.

Оператор среза возвращает фрагмент списка с заданным начальным индексом (включенным) и конечным индексом (не включенным).

list[start_index:end_index]

Давайте создадим список, содержащий числа от 1 до 10:

>>> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Чтобы получить первые 4 элемента списка со стандартным синтаксисом оператора среза, мы можем использовать следующее выражение.

>>> numbers[0:4]
[1, 2, 3, 4]

Примечание: как упоминалось ранее, конечный индекс не включается в список, возвращаемый оператором среза.

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

>>> numbers[:]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Хорошо, но как это помогает нам получать только нечетные числа?

Для этого мы должны кое-что добавить к базовому синтаксису оператора среза, поэтому он называется расширенным синтаксисом.

С расширенным синтаксисом вы можете передать третий аргумент оператору среза — этот аргумент определяет шаг между элементами, которые должны быть извлечены из списка.

list[start_index:end_index:step]

Например, если значение шага равно 2, оператор среза будет извлекать каждые 2 числа.

Теперь, когда мы это знаем, мы готовы извлечь нечетные числа из нашего списка …

>>> numbers[::2]
[1, 3, 5, 7, 9]

В основном мы получаем полный список, потому что мы не указали начальный и конечный индексы. Кроме того, мы получаем только нечетные числа, потому что мы указали шаг, равный 2.

Как вывести четные числа из списка последовательных чисел в Python?

Это очень похоже на то, что мы видели в предыдущем разделе …

Чтобы распечатать четные числа из списка последовательных чисел Python, вы можете использовать расширенный синтаксис среза с начальным индексом, равным 1, пустым конечным индексом и шагом, равным 2.

>>> numbers[1::2]
[2, 4, 6, 8, 10]

И вуаля!

Это довольно просто, если вы привыкнете к синтаксису оператора среза.

Программа Python для печати наибольшего четного и наибольшего нечетного числа в списке

Чтобы напечатать наибольшее четное и нечетное число в списке Python, мы можем начать с понятий, которые мы видели ранее, связанных с оператором среза.

Еще нам необходимо применить функцию max () к списку, возвращаемому оператором среза.

Наибольшее нечетное число

>>> max(numbers[::2])
9

Наибольшее четное число

>>> max(numbers[1::2])
10

Красиво и просто :)

Разработайте программу Python, которая считает четные и нечетные числа в списке, предоставленном пользователем

Прежде чем завершить это руководство, давайте посмотрим, как мы можем использовать функцию ввода Python для получения списка чисел из пользовательского ввода.

Прежде всего, я хочу увидеть, какой тип данных мы получаем от пользовательского ввода.

>>> numbers = input("Please provide a list of numbers (separated by space): ")
Please provide a list of numbers (separated by space): 1 3 6 37 56 23 89 103 346
>>> print(numbers)
1 3 6 37 56 23 89 103 346
>>> print(type(numbers))
<class 'str'>

Пользовательский ввод представляет собой одну строку, поэтому нам нужно немного манипулировать строкой, чтобы сначала преобразовать ее в список.

Метод Python string split () позволяет преобразовать строку в список.

>>> print(numbers.split())
['1', '3', '6', '37', '56', '23', '89', '103', '346']

Это шаг вперед, но у нас все еще есть список строк, а вместо него нужен список целых чисел.

Понимание списка и функция Python int () могут использоваться для преобразования списка строк в список целых чисел:

>>> numbers = ['1', '3', '6', '37', '56', '23', '89', '103', '346']
>>> [int(number) for number in numbers]
[1, 3, 6, 37, 56, 23, 89, 103, 346]

Отлично! :)

И теперь мы готовы создать нашу функцию, которая преобразует строку, предоставленную пользователем, в список целых чисел.

def get_integers(numbers):
    return [int(number) for number in numbers.split()]

После преобразования пользовательского ввода в список целых чисел мы можем вызвать созданную ранее функцию split_list_even_odd ().

Вот полная программа:

def get_integers(numbers):
    return [int(number) for number in numbers.split()]
def split_list_even_odd(numbers):
    odd_numbers = [number for number in numbers if number % 2 == 1]
    even_numbers = [number for number in numbers if number % 2 == 0]
    return odd_numbers, even_numbers
numbers = input("Please provide a list of numbers (separated by space): ")
numbers = get_integers(numbers)
print("The odd numbers are {}".format(split_list_even_odd(numbers)[0]))
print("The even numbers are {}".format(split_list_even_odd(numbers)[1]))

Выполняем нашу программу…

Please provide a list of numbers (separated by space): 1 3 6 34 56 43 67 88 101 102 134
The odd numbers are [1, 3, 43, 67, 101]
The even numbers are [6, 34, 56, 88, 102, 134]

Оно работает!!

Заключение

Если у вас были какие-либо сомнения по поводу извлечения четных и нечетных чисел из списка Python перед чтением этой статьи…

… Теперь у вас есть все необходимые для этого знания.

Если вы чувствуете, что некоторые вещи все еще неясны, вернитесь и самостоятельно перепишите примеры в этом руководстве с нуля.

Практика — лучший способ изучить и запомнить конструкции Python.

Удачного кодирования! : D

Первоначально опубликовано на https://codefather.tech 25 июля 2021 г.

Больше контента на plainenglish.io

Определить чётное или нечётное число

  1. Главная
  2. /
  3. Математика
  4. /
  5. Арифметика
  6. /
  7. Определить чётное или нечётное число

Чтобы определить, является ли число чётным или нечётным, воспользуйтесь нашим очень удобным онлайн определителем:

Введите число:

Просто введите целое число и получите ответ.

Сколько чётных и нечётных чисел между…

Сколько чётных и нечётных чисел от до ?

Теория

Чётное ли число

Чётным является целое число, которое делится на 2 без остатка (нацело).

Все многозначные числа, оканчивающиеся на 0,2,4,6 или 8, являются чётными числами:

10 , 12, 134, 2786, 6389246858 и др.

Примеры

Чётное ли число 10?

10 ÷ 2 = 5

Десять разделилось на два без остатка, следовательно 10 является чётным числом.

Чётное ли число 1?

1 ÷ 2 = 0.5

После деления единицы на два мы получаем нецелое число, следовательно 1 не является чётным числом.

Чётность нуля

Чётное ли число 0?

Ноль (0) является чётным числом.

Ноль чётное число, так как оно делится на два без остатка: 0 ÷ 2 = 0

В числовом ряду с обоих сторон от чётного числа стоят нечётные числа, и ноль тут не исключение, так как -1 это нечётное число:

-5 -4 -3 -2 -1 0 1 2 3 4 5

Нечётные числа

Нечетным является целое число, которое не делится на 2 без остатка.

Все многозначные числа, оканчивающиеся на 1,3,5,7 или 9, являются нечётными числами:

11 , 113, 1245, 43547, 63563469 и др.

Пример

Для примера рассмотрим число 67. Так как оно заканчивается цифрой 7 (нечётной), уже можно утверждать, что оно нечётное. Для пущей уверенности разделим 67 на два:

67 ÷ 2 = 33.5, то есть 33 и остаток 1 (67 = 33 ⋅ 2 + 1)

Окончательно делаем вывод, что число 67 является нечётным числом.

Сколько чётных и нечётных чисел в ряду

Сколько чётных и нечётных чисел находится в ряду между n и m?

Если n и m разные по чётности

Если n и m разные по чётности числа, то есть одно из них четное, а второе нечётное, то количество чётных и нечётных чисел в ряду одинаковое:

Кол чёт/нечёт = (m — n +1) ÷ 2, m > n

Пример

Возьмём ряд чисел между n = 22 и m = 31:

22, 23, 24, 25, 26, 27, 28, 29, 30, 31

Определим количество чётных и нечётных чисел в этом ряду.

Так как 22 и 31 являются числами разной чётности делаем вывод, что чётных и нечётных чисел в данном ряду поровну:

Кол чёт/нечёт = (31 — 22 + 1) / 2 = 10 / 2 = 5

5 чётных и 5 нечётных

22 24 26 28 30
23 25 27 29 31

Если n и m чётные

Если n и m чётные числа, то чётных чисел в ряду будет на одно больше, чем нечётных:

Кол чёт = (m — n) ÷ 2 + 1 , m > n

Кол нечёт = (m — n) ÷ 2 , m > n

Пример

Возьмём ряд чисел между n = 10 и m = 20:

10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20

Определим количество чётных и нечётных чисел в этом ряду.

Кол чёт = (20 — 10) ÷ 2 + 1 = 6

Кол нечёт = (20 — 10) ÷ 2 = 5

6 чётных и 5 нечётных

10 12 14 16 18 20
11 13 15 17 19

Если n и m нечётные

Если n и m нечётные числа, то чётных чисел в ряду будет на одно меньше, чем нечётных:

Кол чёт = (m — n) ÷ 2 , m > n

Кол нечёт = (m — n) ÷ 2 + 1 , m > n

Пример

Возьмём ряд чисел между n = 11 и m = 19:

11, 12, 13, 14, 15, 16, 17, 18, 19

Определим количество чётных и нечётных чисел в этом ряду.

Кол чёт = (19 — 11) ÷ 2 = 4

Кол нечёт = (19 — 11) ÷ 2 + 1 = 5

4 чётных и 5 нечётных

12 14 16 18
11 13 15 17 19

В этом посте мы увидим, как вычислить четность числа с помощью таблицы поиска. Четность связана с общим количеством единиц в двоичном числе.

Нечетная четность (закодированная как 1) означает нечетное количество единиц, а четная четность (закодированная как 0) означает четное количество единиц. Биты четности часто используются как простое средство обнаружения ошибок при передаче и приеме цифровых данных.

Потренируйтесь в этой проблеме

 
Наивным решением было бы вычислять четность, проверяя каждый бит заданного числа один за другим. Затрачиваемое время пропорционально общему количеству битов в числе. Мы можем работать лучше, выключая крайний правый установленный бит числа один за другим и находя четность. Время, которое требуется, пропорционально общему количеству установленных битов. Мы уже обсуждали эти решения в эта почта. В этом посте обсуждаются еще несколько интересных решений.

1. Разделяй и властвуй

Идея состоит в том, чтобы вычислить четность целого числа, рекурсивно разделив 32-битное целое число на две половины и используя их XOR до тех пор, пока не останется только 1 бит. Использование XOR аннулирует установленные биты в одной и той же позиции на две половины, и, поскольку четность не будет затронута, если мы удалим из нее даже установленные биты (почему?), проблема успешно уменьшается до половины на каждом шаге.

Например, мы изначально разделили 32–bit (4 bytes) целое число на два 16–bit куски и взять их XOR. Затем снова разделяем 16–bit врезаться в 8–bit куски и взять их XOR. затем 8–bit фрагменты далее делятся на 4–bits куски и так далее… Этот процесс продолжается до тех пор, пока не останется только 1 бит.

 
Ниже приведена реализация C++, Java и Python, основанная на приведенной выше идее:

C++

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

#include <iostream>

#include <bitset>

using namespace std;

// Вычисление четности числа `x` с помощью таблицы поиска

int findParity(int x)

{

    // рекурсивное деление (32-битного) целого числа на два равных

    // делим пополам и берем их XOR до тех пор, пока не останется только 1 бит

    x = (x & 0x0000FFFF) ^ (x >> 16);

    x = (x & 0x000000FF) ^ (x >> 8);

    x = (x & 0x0000000F) ^ (x >> 4);

    x = (x & 0x00000003) ^ (x >> 2);

    x = (x & 0x00000001) ^ (x >> 1);

    // вернуть 1, если установлен последний бит; в противном случае вернуть 0

    return x & 1;

}

int main()

{

    int x = 127;

    cout << x << » in binary is « << bitset<8>(x) << endl;

    if (findParity(x)) {

        cout << x << » contains odd bits»;

    }

    else {

        cout << x << » contains even bits»;

    }

    return 0;

}

Скачать  Выполнить код

результат:

127 in binary is 01111111
127 contains odd bits

Java

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

class Main

{

    // Вычисление четности числа `x` с помощью таблицы поиска

    public static boolean findParity(int x)

    {

        // рекурсивное деление (32-битного) целого числа на два равных

        // делим пополам и берем их XOR до тех пор, пока не останется только 1 бит

        x = (x & 0x0000FFFF) ^ (x >> 16);

        x = (x & 0x000000FF) ^ (x >> 8);

        x = (x & 0x0000000F) ^ (x >> 4);

        x = (x & 0x00000003) ^ (x >> 2);

        x = (x & 0x00000001) ^ (x >> 1);

        // вернуть true, если установлен последний бит

        return (x & 1) == 1;

    }

    public static void main(String[] args)

    {

        int x = 127;

        System.out.println(x + » in binary is « + Integer.toBinaryString(x));

        if (findParity(x)) {

            System.out.println(x + » contains odd bits»);

        }

        else {

            System.out.println(x + » contains even bits»);

        }

    }

}

Скачать  Выполнить код

результат:

127 in binary is 1111111
127 contains odd bits

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

# Вычислить четность числа `x` с помощью таблицы поиска

def findParity(x):

    # рекурсивно делит (32-битное) целое число на два равных

    # делится пополам и берет их XOR, пока не останется только 1 бит

    x = (x & 0x0000FFFF) ^ (x >> 16)

    x = (x & 0x000000FF) ^ (x >> 8)

    x = (x & 0x0000000F) ^ (x >> 4)

    x = (x & 0x00000003) ^ (x >> 2)

    x = (x & 0x00000001) ^ (x >> 1)

    # возвращает true, если установлен последний бит

    return (x & 1) == 1

if __name__ == ‘__main__’:

    x = 127

    print(f‘{x} in binary is {bin(x)}’)

    if findParity(x):

        print(x, ‘contains odd bits’)

    else:

        print(x, ‘contains even bits’)

Скачать  Выполнить код

результат:

127 in binary is 0b1111111
127 contains odd bits

Вот оптимизированная версия вышеуказанного решения, которая включает меньшее количество операций:

C++

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

#include <iostream>

#include <bitset>

using namespace std;

// Вычисление четности числа `x` с помощью таблицы поиска

int findParity(int x)

{

    // рекурсивное деление (32-битного) целого числа на два равных

    // делим пополам и берем их XOR до тех пор, пока не останется только 1 бит

    x ^= x >> 16;

    x ^= x >> 8;

    x ^= x >> 4;

    x ^= x >> 2;

    x ^= x >> 1;

    // вернуть 1, если установлен последний бит; в противном случае вернуть 0

    return x & 1;

}

int main()

{

    int x = 15;

    cout << x << » in binary is « << bitset<8>(x) << endl;

    if (findParity(x)) {

        cout << x << » contains odd bits»;

    }

    else {

        cout << x << » contains even bits»;

    }

    return 0;

}

Скачать  Выполнить код

результат:

15 in binary is 00001111
15 contains even bits

Java

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

class Main

{

    // Вычисление четности числа `x` с помощью таблицы поиска

    public static boolean findParity(int x)

    {

        // рекурсивное деление (32-битного) целого числа на два равных

        // делим пополам и берем их XOR до тех пор, пока не останется только 1 бит

        x ^= x >> 16;

        x ^= x >> 8;

        x ^= x >> 4;

        x ^= x >> 2;

        x ^= x >> 1;

        // вернуть true, если установлен последний бит

        return (x & 1) == 1;

    }

    public static void main(String[] args)

    {

        int x = 15;

        System.out.println(x + » in binary is « + Integer.toBinaryString(x));

        if (findParity(x)) {

            System.out.println(x + » contains odd number of bits»);

        }

        else {

            System.out.println(x + » contains even number of bits»);

        }

    }

}

Скачать  Выполнить код

результат:

15 in binary is 1111
15 contains even number of bits

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

# Вычислить четность числа `x` с помощью таблицы поиска

def findParity(x):

    # рекурсивно делит (32-битное) целое число на два равных

    # делится пополам и берет их XOR, пока не останется только 1 бит

    x ^= x >> 16

    x ^= x >> 8

    x ^= x >> 4

    x ^= x >> 2

    x ^= x >> 1

    # возвращает true, если установлен последний бит

    return (x & 1) == 1

if __name__ == ‘__main__’:

    x = 15

    print(f‘{x} in binary is {bin(x)}’)

    if findParity(x):

        print(‘Number contains an odd number of bits’)

    else:

        print(‘Number contains an even number of bits.’)

Скачать  Выполнить код

результат:

15 in binary is 0b1111
Number contains an even number of bits.

2. Использование таблицы поиска

Мы можем использовать справочную таблицу, чтобы найти четность за постоянное время. Целое число в C/C++ обычно занимает 4 байта для хранения. Это означает, что максимальное число, которое он может хранить, равно 232-1. Таблица поиска для всех 232-1 целые числа будут недопустимы (не забывайте, что у нас есть и отрицательные числа). Хитрость заключается в том, чтобы создать 8–bit (1 byte) версия таблицы, затем итерация по каждому байту в целом числе, которое нужно проверить, и суммирование результатов поиска в таблице.

1 байт со всеми установленными битами равен 255 в десятичном виде (11111111 в двоичном формате), а все неустановленные биты равны 0 в десятичном (00000000 в двоичном формате). Таким образом, таблица поиска должна иметь размер 256. (0-255).

 
В следующем решении используются макросы для создания таблицы поиска. Таблица поиска будет сгенерирована препроцессором во время компиляции. Первые и последние несколько чисел последовательности будут такими:

{ 0, 1, 1, 0, 1, 0, … , 0, 1, 0, 1, 1, 0 } as

 
The parity of 0 is 0
The parity of 1 is 1
The parity of 2 is 1
The parity of 3 is 0
The parity of 4 is 1
The parity of 5 is 0
……
……
The parity of 250 is 0
The parity of 251 is 1
The parity of 252 is 0
The parity of 253 is 1
The parity of 254 is 1
The parity of 255 is 0

Рассмотреть возможность n = 1691315356 (в двоичном формате 01100100110011110110110010011100)

1. Split the 32–bit integer into 16–bit chunks:

 
0110010011001111 | 0110110010011100

 
 
2. Take their XOR:

 
0110010011001111  ^
0110110010011100
~~~~~~~~~~~~~~~~
0000100001010011

 
 
3. Split the 16–bit result into 8–bit chunks:

 
00001000 | 01010011

 
 
4. Take their XOR:

 
00001000  ^
01010011
~~~~~~~~
01011011

В настоящее время, 01011011 91 в десятичном виде, и lookup[91] вернет 1 (нечетная четность). Разделение и операция XOR выполняются в одном выражении для каждого фрагмента в следующем решении C++:

C++

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

#include <iostream>

#include <bitset>

using namespace std;

// Макросы для создания таблицы поиска (во время компиляции)

#define P2(n) n, n^1, n^1, n

#define P4(n) P2(n), P2(n^1), P2(n^1), P2(n)

#define P6(n) P4(n), P4(n^1), P4(n^1), P4(n)

#define FIND_PARITY P6(0), P6(1), P6(1), P6(0)

// таблица поиска для хранения четности каждого индекса таблицы.

// Макрос `FIND_PARITY` генерирует таблицу

unsigned int lookup[256] = { FIND_ПАРИТЕТ };

// Функция для нахождения четности `x`

int findParity(int x)

{

    // вывести таблицу поиска (четность целого числа `i`)

    /*

    for (int i = 0; i < 256; i++) {

        cout << «Четность » << i << » равна » << lookup[i] << endl;

    }

    */

    // Предполагая, что целое число 32-битное (4 байта), разбить целое число на

    // 16-битные чанки и берем их XOR

    x ^= x >> 16;

    // Снова разделяем 16-битный фрагмент на 8-битные фрагменты и берем их XOR

    x ^= x >> 8;

    // Используемая маска заметки 0xff равна 11111111 в двоичном формате

    return lookup[x & 0xff];

}

int main()

{

    int x = 17;

    cout << x << » in binary is « << bitset<8>(x) << endl;

    if (findParity(x)) {

        cout << x << » contains odd bits»;

    }

    else {

        cout << x << » contains even bits»;

    }

    return 0;

}

Скачать  Выполнить код

результат:

17 in binary is 00010001
17 contains even bits

Использованная литература: https://graphics.stanford.edu/~seander/bithacks.html

Понравилась статья? Поделить с друзьями:

Не пропустите также:

  • Как найти концентрацию взвесить
  • Как составить краткий пересказ рассказа
  • Как найти прирост в процентах от числа
  • Как найти задолжника у приставов
  • Как найти свой штраф за парковку

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии