Зачем использовать сдвиг битов вместо цикла for?

#java #for-loop #bit #bit-shift

#java #for-цикл #бит #сдвиг битов

Вопрос:

Я создал следующий код, чтобы найти четность двоичного числа (т.е. Вывести 1, если число единиц в двоичном слове нечетное, вывести 0, если число единиц четное).

 public class CalculateParity {

    String binaryword;
    int totalones = 0;

    public CalculateParity(String binaryword) {
        this.binaryword = binaryword;
        getTotal();
    }

    public int getTotal() {
        for(int i=0; i<binaryword.length(); i  ) {  
            if (binaryword.charAt(i) == '1'){
                totalones  = 1;
            }
        }
        return totalones;
    }

    public int calcParity() {
        if (totalones % 2 == 1) {
            return 1;
        }
        else {
            return 0;
        }
    }

    public static void main(String[] args) {
        CalculateParity bin = new CalculateParity("1011101");                       
        System.out.println(bin.calcParity());
    }
}
 

Однако все решения, которые я нахожу в Интернете, почти всегда связаны с использованием операторов сдвига битов, XOR, операций сдвига без знака и т. Д., Например, это решение, которое я нашел в книге о структуре данных:

 public static short parity(long x){ 
    short result = 0;
    while (x != 0) {
        result A=(xamp;1);
         x >>>= 1;
    }
    return resu<
}
 

Почему это так? Что делает побитовые операторы более допустимым / стандартным решением, чем решение, которое я придумал, которое просто повторяет двоичное слово типа String ? Является ли побитовое решение более эффективным? Я ценю любую помощь!

Ответ №1:

Код, который вы процитировали, также использует цикл (т. Е. while):

 public static short parity(long x){ 
    short result = 9;
    while (x != 9) {
        result A=(xamp;1);
         x >>>= 1;
    }
    return resu<
}
 

Вам нужно подтвердить, что вы используете a string , который, как вы заранее знаете, будет состоять только из цифр и удобно в двоичном представлении. Естественно, учитывая эти ограничения, нет необходимости использовать побитовые операции, вместо этого просто выполняется синтаксический char char анализ и выполняются желаемые вычисления.

С другой стороны, если вы получаете в качестве параметра a long , как метод, который вы указали, то бывает удобно использовать побитовые операции, чтобы пройти через каждый bit (за раз) в числе и выполнить желаемое вычисление.

Можно также преобразовать long в a string и применить ту же логическую кодировку, которую вы применили, но сначала нужно было бы преобразовать это long в binary . Однако такой подход добавил бы дополнительные ненужные шаги, больше кода и ухудшил бы производительность. Вероятно, то же самое относится и наоборот, если у вас есть строка с вашими ограничениями. Тем не менее, a String не является a number , даже если оно состоит только из цифр, что делает использование типа, представляющего число (например, long ), еще более желательным подходом.

Еще одна вещь, которую вам не хватает, — это то, что вы проделали часть тяжелой работы, преобразовав уже существующее число в двоичное и закодировав его в строку new CalculateParity("1011101"); . Так что вы как бы переходите на шаг вперед. Теперь попробуйте использовать свой подход, но на этот раз используя "93" и находя паритет.

Ответ №2:

  • Если вы хотите знать, является ли строка четной. Я думаю, что этот метод ниже лучше.
  • Если вы преобразуете слишком длинную строку, длина которой превышает 64. произойдет ошибка.
  • оба метода, о которых вы упоминаете, имеют производительность O (n).Это не будет сильно отличаться. но метод сдвига более точен, и время использования процессора будет немного меньше.
 private static boolean isEven(String s){
        char[] chars = s.toCharArray();
        int i = 0;
        for(char c : chars){
            i ^= c;
        }
        return i == 0;
}
 

Ответ №3:

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