Как я могу сказать, является ли число кратным четырем использованиям только логический оператор И?

n и x являются локальными переменными в ваших методах. И имейте в виду, что, например, n из evenOdd() не имеют ничего, кроме названия, общего с n из boxMake(). Если вы хотите использовать n и x во всем вашем классе, определите их как членов класса.

import java.util.*;
public class Method{
private int n;
private int x;
8
задан Evan Teran 14 April 2009 в 06:48
поделиться

4 ответа

Ну, чтобы определить, является ли число кратным другому, вам просто нужно сделать x MOD y . Если результат равен 0 , то он является четным кратным.

Также верно, что для каждого y это степень 2 , (x MOD y) эквивалентно (x AND (y - 1)) .

Следовательно:

IF (x AND 3) == 0 THEN
    /* multiple of 4 */

РЕДАКТИРОВАТЬ:

хорошо, вы хотите знать почему (x MOD y) == (x AND (y - 1)) , когда y является степенью 2. Я сделаю все возможное, чтобы объяснить.

По сути, если число является степенью 2, то для него установлен один бит (поскольку двоичное является основанием 2). Это означает, что все младшие биты не установлены. Например: 16 == 10000b, 8 == 1000b и т. Д.

Если вы вычтите 1 из любого из этих значений. В результате получается, что установленный бит не установлен, а все биты ниже него установлены.

15 = 01111b, 7 = 0111b и т. Д. Таким образом, в основном это создает маску, которая может использоваться для проверки, если любой из младших битов был установлен. Я надеюсь, что это было ясно.

РЕДАКТИРОВАТЬ: Комментарий Бастьена Леонара также хорошо его охватывает:

если вы поделите (без знака) на 4, вы сдвинуть два бита вправо. Таким образом Остальные те два бита, которые получают потерян, когда вы разделите. 4 - 1 = 11b, то есть маска, которая дает два самые правые биты, когда вы И это с значение.

РЕДАКТИРОВАТЬ: см. на этой странице, возможно, более четкие объяснения: http://en.wikipedia.org/wiki/Power_of_two#Fast_algorithm_to_check_if_a_positive_number_is_a_power_of_two детектирования [122720] и обнаружение

  • ] используя AND как быструю операцию по модулю, если это степень 2.

  • 22
    ответ дан 3 November 2019 в 14:03
    поделиться

    (x & 3) == 0

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

    4
    ответ дан 3 November 2019 в 14:03
    поделиться

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

    1
    ответ дан 3 November 2019 в 14:03
    поделиться

    В сборке x86:

        test eax, 3
        jnz not_multiple_of_4
    
        ; action to be taken if EAX is a multiple of 4
    
    not_multiple_of_4:
        ; ...
    
    1
    ответ дан 3 November 2019 в 14:03
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: