Неравноценный обмен

  • 20
  • Недоступна
Продолжая разработку алгоритма, нам очень бы пригодился метод который бы менял указанные биты в двоичном представлении числа типа long. Реализуй метод long swapBits(long number, int i, int j), который будет в двоичном представлении числа number менять местами биты с индексами i и j и возвращать рез
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (17)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Interstellar34 уровень, Воронеж
28 августа, 07:07
Не хочу голову забивать никакими побитовыми операциями. сделал с помощью BitSet. Тут пример с ним, но не как в нашей задаче.
Николай41 уровень, Санкт-Петербург
23 июня, 22:09
Выделяем i-й и j-й бит (нумерацию битов начинаем с 0 справа налево) посредством сдвига и логического умножения с 1. Если эти биты друг другу не равны, то меняем их местами с помощью исключающего ИЛИ с числом, у которого только биты с указанными индексами равны единице (опять используем сдвиг).
Андрей35 уровень
8 мая, 12:07
Как и в прошлой задаче, загнал двоичное число в массив символов, нулями расширил массив до нужного разряда, поменял местами ячейки с заданными индексами, свернул получившееся в long-число. Валидатор принял. Наверное, авторы ждали чего-то другого, но уж больно побитовые операции изучать не хочется.
MartyMcAir41 уровень
7 мая, 18:16
Не оч. понял. что имелось ввиду под индексами битов т.к. 20ка в двоичном.. это: 1 0 1 0 0 ... иии т.е. если подразумевать под индексами это слева направо начиная с нуля для swapBits(20, 1, 2)... означает что результ внутри метода свапаем 1ый и второй индекс значит: 1 1 0 0 0 ___ и на выходе это 24 ___ Ноо ответ верный другой... т.е. индексы подразумевается что они справа на лево выходит так!? Из результа что валя принял..:
System.out.println(swapBits(20, 1, 2));   // результ будет 18
Long.toBinaryString(number);   // на входе 20тка это: 1 0 1 0 0
в процессе вычислений битовых сдвигов и прочей магии внутри метода ... в двоичном выражении на выходе из 20тки получится...
Long.toBinaryString(result);   // на выходе 18 это: 1 0 0 1 0
Как достаточно хорошо усвоить, эти биты с системами исчислений!? (Какие книги ресурсы просмотреть?) (регулярки кажутся не простыми но биты..)
Tat41 уровень
11 апреля, 11:20
Класс BitSet спасет ваши нервы.
vinograd33 уровень
8 апреля, 08:14
1064, Установить бит в 0 мжно так
long in = 1L << i;
number &= (Long.MAX_VALUE ^ in);
тк. MaxValue полностью заполнен 1
Leonid41 уровень, Киев
27 июня, 12:53
Или без MaxValue
number &= ~(1L << i);
Constantine41 уровень, Москва
13 февраля, 12:22
1001-й Не всем хватило запалу до этих задачек дойти. Держитесь!
skybright41 уровень
3 января, 19:55
Короче, это надо запомнить или хотя бы записать:
//установить нулевой бит
PORTB | = 0x01;

//сбросить нулевой бит
PORTB &= ~0x01;

//проверить установлен ли бит
if(PORTB & 0x01)
{

}

//инвертировать значение нулевого бита
#define    LED    0x01
PORTB ^= LED;
Ну и, конечно, бит двигаем сразу лонговый (1L)
Дмитрий Ушаков41 уровень, Красноярск
29 марта, 06:37
что это такое вообще?
skybright41 уровень
30 марта, 17:48
Побитовые операции на языке C. На Java делается аналогично. Операции можно проводить не только с нулевым (крайнем справа) битом, бит(совокупность битов) может быть в любом месте.
Максим В. Кузнецов41 уровень, Нижний Новгород
17 декабря 2019, 04:20
наркоманская задача
Даниил41 уровень
21 октября 2019, 20:24
869-й. Без гугла не решил) Хотя это ж не плохо если ты нашёл готовое решение не к заданию JavaRush, а к поставленной задаче.