Обратные биты в номере - PullRequest
16 голосов
/ 02 июля 2010

Например, у меня есть двоичное число 1011, которое равно десятичному 11. Я хочу, чтобы местоположение обратного бита стало 1101, что является десятичным 13. Вот код:

import java.util.*;
public class bits {
    public static void main(String[] args) {
        Scanner scnr=new Scanner(System.in);
        System.out.println("enter x:");
        int x=scnr.nextInt();
        int b=0;
        while (x!=0){
            b|=( x &1);
            x>>=1;
            b<<=1;
        }
        System.out.println(b);
    }
}

Но когда я ввожу x 11, тогда выводится 26. В чем ошибка?

Ответы [ 12 ]

25 голосов
/ 02 июля 2010

Вы сдвигаете b один раз слишком много.Сначала выполните сдвиг (чтобы в первый раз, когда b == 0, это не имело никакого эффекта):

while (x!=0){
  b<<=1;
  b|=( x &1);
  x>>=1;
}
14 голосов
/ 02 июля 2010

Слегка оффтоп.Также есть опция встроенных функций реверсирования битов в Java.

См. http://java.sun.com/javase/6/docs/api/java/lang/Integer.html#reverse(int)

РЕДАКТИРОВАТЬ: Это предполагает, что вы используете Java 1.5 или новее.

3 голосов
/ 08 февраля 2013
  1. Используйте >>>= вместо >>=
  2. Если вы хотите изменить сигнатуру метода на public static byte reverse(byte in), это не будет работать с отрицательными значениями, поскольку существует неявное приведение к int.
2 голосов
/ 02 мая 2016

Примечание для начинающих: я использую шестнадцатеричное (0-9 и AF), потому что одна шестнадцатеричная цифра отлично отображается в 4 двоичных разряда.Вместо записи 1010 я использую A (10 десятичных).Вы можете указать Java использовать шестнадцатеричное (литералы), начиная с 0x, как в 0x0A.

Как указано выше, 1 должно вывести 8 (от 0001 до 1000).Таким образом, вместо while (x! = 0) код должен сдвинуть первый бит так, чтобы длина битов, необходимых в этом примере, составляла 4.

for (int i = 0; i < 4; ++i) { // not while (x!=0){
   b<<=1;
   b|=( x &1);
   x>>=1;
}
Hex convert 0-F: 0=0 1=8 2=4 3=C 4=2 5=A 6=6 7=E 8=1 9=9 A=5 B=D C=3 D=B E=7 F=F

Или пример полного 8-битного:

public static byte reverse(byte x) {
    byte b = 0;
    for (int i = 0; i < 8; ++i) {
        b<<=1;
        b|=( x &1);
        x>>=1;
      }
    return b;
}
public static void main(String args[]) {
    byte[] nums = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 
            (byte) 0xAA, (byte) 0xFE, (byte) 0xFF };
    for (byte b : nums) {
        System.out.printf("%02X=%02X ", b, reverse(b));
    }
    System.out.println();
}

Выход:

00=00 01=80 02=40 03=C0 04=20 05=A0 06=60 07=E0 08=10
09=90 0A=50 0B=D0 0C=30 0D=B0 0E=70 0F=F0 10=08 11=88 AA=55 FE=7F FF=FF
2 голосов
/ 01 апреля 2014

Программа не работает для ввода типа 1, 2

int reverseBits(int x)
    {
        int b = 0;
        while (x != 0)
        {
            b <<= 1;
            b |= ( x & 1);
            x >>= 1
        }
        return b;
    }

вход 1, выход 1, должно быть 8, верно? вход 2 выход 1, должно быть 4.

1 голос
/ 08 марта 2015
while(x!=0){
    b<<=1;
    b|=(x&1);
    x>>=1;
}
1 голос
/ 02 июля 2010

Сдвиг влево b на один раз больше, чем требуется.Добавьте b >>= 1 после цикла while.

1 голос
/ 02 июля 2010

вы сдвинули б один раз слишком много.попробуйте сместить b влево перед выполнением | =:

    while (x!=0){
           b<<=1;
           b|=( x &1);
           x>>=1;

         }
   System.out.println(b);
1 голос
/ 02 июля 2010

b сдвигается влево слишком часто.Я ожидаю, что ввод 1 приведет к выводу 2. Переместите Shift на две строки вверх.

0 голосов
/ 21 августа 2016

Мой новый Java-код инвертирует биты в целое число, используя Java с мощной битовой манипуляцией.Работает с положительными, отрицательными и нулевыми значениями.Надеюсь, это поможет.

public static int  reverseDigits(int num) throws Exception {
        if (num == 0) {         
            return Integer.MAX_VALUE | Integer.MIN_VALUE;
        }

        int count = Integer.SIZE * 8 - 1;
        int  reversed = num;        
        boolean positive = true;

        if (num < 0) {
            positive = false;
        }

        if (positive) num >>= 1;

        while(num != 0) {

            reversed <<= 1; 
            reversed |= (num & 1);          

            num >>>= 1;
            count--;            
        }

        if (positive) reversed <<= count;
        return reversed;
    }

Вы можете представить биты в целых числах с помощью моего другого кода манипуляции битами в java, который печатает нули слева: https://stackoverflow.com/a/39056535/6738542

Поскольку Integer.toBinaryString ()скрыть нули слева.

Металл | ,, |

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...