Почему делает “$ ((~33))”, производят-34?

Можно установить index_format переменная для включения всего способа различных деталей о каждом сообщении. В частности, Вы, вероятно, хотите %d строка формата, которая вставляет дату, отформатированную согласно значению date_format, или одна из других строк формата даты, такой как %{fmt}, %[fmt], и т.д. Как пример, вот мое значение по умолчанию index_format установка:

set 'index_format="%4C %Z %{%b %d} %-15.15L (%4l) %s"'

Смотрите на документацию для получения дополнительной информации о том, что можно настроить, и что представляют расширенные строки формата даты.

12
23.02.2014, 19:23
5 ответов

В странице справочника удара говорится:

   ! ~    logical and bitwise negation

Числа со знаком обычно хранятся в дополнительном представлении Two:

...
-4 = 1100
-3 = 1101
-2 = 1110
-1 = 1111
 0 = 0000
 1 = 0001
 2 = 0010
 3 = 0011
...

Это означает, берете ли Вы число как 2, оно поразрядно интерпретируется как 0010. После поразрядного отрицания это становится 1101, который является представлением-3.

21
27.01.2020, 19:54

Это - результат дополнительной арифметики two.

~ поразрядное отрицание, которое инвертирует все биты, управляемые на. Дополнительная арифметика Two работает путем инвертирования всех битов и добавления 1. Так как Вы только зеркально отразили биты, но не добавили один, Вы получаете то же число, инвертированное, минус одно.

Википедия имеет хорошую статью о дополнении two здесь.

Как пример:

  • 3 в двоичном файле 0011
  • - 3 в (дополнение two) двоичный файл 1101
  • Инвертирование 0011 дает Вам 1100, который является-4, так как Вы не добавили 1.
10
27.01.2020, 19:54

~ оператор является оператором битового "НЕ". Используя его не то же как отрицание числа.

Из Википедии операция битового "НЕ" равна взятию дополнения two значения минус одно:

НЕ x = −x − 1

Отрицание двоичного числа эквивалентно принятию его значения с двумя дополнениями.

Используя ~ оператор NOT = принимают его значение с одним дополнением.

В более простых терминах, ~ просто зеркально отражает все биты двоичного представления.

Для Ваших примеров:

33 (десятичных числа) = 0x00100001 (8-разрядный двоичный файл)

~33 = ~0x00100001 = 0x11011110 =-34 (десятичное число)

Или в десятичных системах счисления, с помощью ~x =-x - 1 формула:

~33 =-33 - 1 =-34

и

~255 =-255 - 1 =-256

3
27.01.2020, 19:54

Проблема в том, что ~ является битовым оператором. Следовательно, вы отрицаете больше битов, чем вы, возможно, намереваетесь. Вы можете видеть это лучше, преобразуя результаты в шестнадцать, например:

result_in_hex=$(printf "%x" $(( ~33 ))); echo $result_in_hex
ffffffffffffffde

в сравнении с тем, что у вас было:

result_in_dec=$(printf "%d" $(( ~33 ))); echo $result_in_dec
-34

Я предполагаю, что вы имеете в виду свести на нет 0x33. Если это так, то это сработает:

result_in_hex=$(printf "%2x" $(( ( ~ 0x33 ) & 0xFF))); echo $result_in_hex
cc

Вы также должны использовать &, который является bit-wise и оператор, чтобы избежать всех ff в начале.

1
27.01.2020, 19:54

Сначала вы должны понять, что 33 — это 32-битное или 64-битное число.

Для удобства я беру восьмибитное число (= 1 байту)

десятичное число 33 состоит из восьми битов :00100001, перестановка битов дает 11011110.

Поскольку старший бит равен 1, это отрицательное число.

При печати отрицательного числа система печатает знак минус, а затем дополнение до двух отрицательного числа.

Дополнение до двух равно :перестановке битов и добавлению 1.

11011110 ==> 00100001 ==> добавление 1 ==> 00100010 приводит к десятичному числу 34 за знаком минус.

0
20.08.2021, 13:12

Теги

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