Подробный анализ исходного двоичного кода, дополнения, дополнения и << и >> и >>> в Java

Java

1. Наименьший единичный бит в компьютерной двоичной системе.

В компьютерной двоичной системе: бит (бит): наименьшая единица хранения данных. сокращенноb, также известные как биты (bit), каждая двоичная цифра 0 или 1 является битом (bit), где каждый8bit = 1 byte(байт);

Давайте рассмотрим типы данных в Java, такие какint数据类型 = 4个byte(字节),а также1 byte(字节) = 8 bit(位); как мы часто говоримint = 32位(Проще говоря, биты используются в качестве единиц хранения данных в двоичной системе). следующим образом

在这里插入图片描述

2. Знаковые и беззнаковые числа

Числа со знаком и числа без знака просто соответствуют положительным числам и отрицательным числам соответственно.В двоичной системе биты используются в качестве единиц хранения данных.Старший бит (первый бит) является битом знака, бит знака для положительных чисел равен «0», а бит знака для отрицательных чисел равен «1».

пример:

Предположениеint number = 1, то число будет представлено в компьютерной системе следующим образом:

00000000 00000000 00000000 00000001

То же самое можно получить,number = -1представляется в двоичном виде следующим образом:

10000000 00000000 00000000 00000001

Примечание: старший бит (первый бит) является битом знака, поскольку числовое значение 1 является положительным числом, поэтому старший бит равен 0;

3. Двоичный исходный код, обратный код, дополнительный код

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

дополнениеРезультат умножения и деления исходного кода со знаковым битом правильный, но есть проблема со сложением и вычитанием, например: выражено в десятичном виде:1 + (-1) = 0, но в двоичном формате:

00000001 + 10000001 = 10000010,

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

дополнятьХотя появление дополнительного кода и решает проблему сложения и вычитания положительных и отрицательных чисел, оно заставляет число 0 иметь две «формы»: «0» и «-0», но это нелогично, должна быть только одна 0 , поэтому есть дополнение.

Для подписанных номеров:

1. Исходный код, обратный код и дополнительный код положительных чисел совпадают; 2. Обратный код отрицательного числа = знаковый бит его исходного кода остается неизменным, а остальные биты инвертируются (инверсия означает: 0 заменяется на 1, 1 заменяется на 0); 3. Дополнение отрицательного числа = его дополнение +1; 4. Дополнение и дополнение 0 равны 0;【обращать внимание】 1. Когда компьютерные операции выполняются, они выполняются в дополнении. 2. Чтобы преобразовать двоичный код в десятичный, для преобразования необходимо использовать исходный двоичный код.

пример:

Давайте воспользуемся «числом со знаком», чтобы смоделировать его работу на компьютере.

(1) Сложение положительных чисел:

Например: 1+1, операция в компьютере выглядит следующим образом:

Исходный код 1:

00000000 00000000 00000000 00000001

Поскольку «исходный код, обратный код и дополнительный код положительных чисел одинаковы», дополнение 1 = исходный код 1, поэтому дополнение 1 + дополнение 1 равно:

00000000 00000000 00000000 00000001 + 00000000 00000000 00000000 00000001

=

00000000 00000000 00000000 00000010

00000000 00000000 00000000 00000010 (в десятичном виде) = 2

(2) Вычтите положительные числа:

Например: 1 - 2, операция в компьютере выглядит следующим образом:

Операция вычитания в компьютере фактически выполняется как операция сложения, поэтому 1 - 2 = 1 + (-2)

Шаг 1: Узнайте дополнительный код 1 (поскольку исходный код, обратный код и дополнительный код положительных чисел одинаковы, поэтому мы можем напрямую получить дополнительный код через исходный код):

1 дополнение:

00000000 00000000 00000000 00000001

Шаг 2: Узнайте исходный код -2:

Исходный код -2:

10000000 00000000 00000000 00000010

Шаг 3: Найдите дополнение -2:

-2 дополнение:

11111111 11111111 11111111 11111101

Шаг 3: Найдите дополнение -2:

-2 дополнение:

11111111 11111111 11111111 11111110

Шаг 4: Добавьте дополнение 1 к дополнению -2:

00000000 00000000 00000000 00000001 + 11111111 11111111 11111111 11111110

=

11111111 11111111 11111111 11111111

Шаг 5: Преобразуйте дополнение результата вычисления в исходный код и сделайте наоборот (если вы хотите преобразовать двоичный код в десятичный, вы должны получить исходный двоичный код)

Дополнение: 11111111 11111111 11111111 11111111

=

Обратный код: 11111111 11111111 11111111 11111110

=

Исходный код: 10000000 00000000 00000000 00000001

Шаг 6: Преобразование исходного двоичного кода результата расчета в десятичный

Исходный двоичный код: 10000000 00000000 00000000 00000001 = 1*2^0 = -1

4. Размышление: почему диапазон значений byte в java составляет -128~127

В java байт занимает один байт, то есть 8 бит (бит), из которых старший бит является битом знака, а остальные 7 бит используются для представления значения.Если бит знака равен 0, он представляется как положительное число и диапазон 00000000~01111111 (дополнительная кодовая форма), то есть 0-127 в десятичном формате.Если бит знака равен 1, он выражается как отрицательное число и диапазон 10000000~11111111 форма дополнения), -128~-1, 11111111 преобразуется в исходный код 10000001, то есть -1. В дополнительном коде, чтобы избежать существования "-0", 10000000 указывается как -128, поэтому объясняется, почему диапазон значений байта составляет -128~127.

5. > и >>> в Java

Прежде всего, > и >>> являются побитовыми операторами в java и работают с двоичными данными. В дополнение к ним есть &, |, ^, ~, несколько битовых операторов. Независимо от того, на какой основе основано начальное значение, оно будет преобразовано в двоичный код для обработки битов. Здесь мы в основном объясняем > и >>> в Java.

Примечание: для следующих типов данных по умолчанию используется byte как 8 бит.При сдвиге влево, независимо от того, положительный он или отрицательный, младшие биты заполняются 0.

Положительные числа: r = 20

Дополнение до двойки   20: 0001 0100

   После перемещения на две позиции влево: 0101 0000

        Результат: r = 80

Отрицательные числа: r = -20

Исходный двоичный код   -20: 1001 0100

Дополнение до единицы   -20: 1110 1011

Дополнение до двойки   -20: 1110 1100

   Дополнение до двух со сдвигом влево: 1011 0000

         обратный код: 1010 1111

        Исходный код: 1101 0000

         Результат: r = -80

‘>>’ означает сдвиг вправо, если число положительное, старший разряд заполняется 0, если отрицательный, старший разряд заполняется 1;

Примечание. Для следующих типов данных по умолчанию используется 8-битный байт.

Положительные числа: r = 20 >> 2 

Дополнение до двойки   20: 0001 0100

   После перемещения на две позиции вправо: 0000 0101

        Результат: r = 5

Отрицательные числа: r = -20 >> 2 

Исходный двоичный код   -20: 1001 0100

Дополнение до единицы   -20: 1110 1011

Дополнение до двойки   -20: 1110 1100

   Дополнение до двух после сдвига вправо: 1111 1011

Дополнение         : 1111 1010

        Исходный код: 1000 0101

         Результат: r = -5

' >>> ' означает сдвиг вправо без знака, также называемый логическим сдвигом вправо, то есть, если число положительное, старшие биты заполняются 0, а если число отрицательное, старшие биты также заполняются с 0 после сдвига вправо

Примечание. Следующие типы данных по умолчанию имеют значение int 32 бита.

Положительные числа:  r = 20 >>> 2

Результат      такой же, как r = 20 >> 2;

Отрицательные числа:  r = -20 >>> 2

  -20 исходный код: 10000000 00000000 00000000 00010100

Дополнение     : 11111111 11111111 11111111 11101011

Дополнение     : 11111111 11111111 11111111 11101100

     Вправо: 00111111 11111111 11111111 11111011

     результат: г = 1073741819

Наконец, если есть какие-либо недостатки или неточности, добро пожаловать на исправления и критику, большое спасибо!

Приглашаю всех обратить внимание на мою официальную учетную запись, там есть некоторые учебные материалы по Java и большая волна электронных книг по Java, таких как всесторонняя виртуальная машина Java г-на Чжоу Чжимина, идеи программирования Java, тома основных технологий, большой разговор о дизайне. паттерны, борьба с параллельным программированием на Java... .. Это все библия Java, не говоря уже о том, чтобы садиться в машину Tomcat, поехали! Самое главное — вместе обсуждать технологии, тосковать по технологиям, заниматься технологиями, а когда они согласованы, это друг по горшку…

在这里插入图片描述

Ссылаться на:woo woo woo.cn blog on.com/summer data/… блог woo woo woo.cn на.com/blow clean…