1 Примечания
- В Питоне,
#
Обозначает комментарий, относящийся ко всей строке. -
''' '''
или""" """
Обозначает интервальный комментарий, комментируется все, что заключено в тройные кавычки.
[Пример] Однострочный комментарий
# 这是一个注释
'''
这是多行注释,用三个单引号
这是多行注释,用三个单引号
这是多行注释,用三个单引号
'''
2 есть и ==
a = "hello"
b = "hello"
print(a is b, a == b) # True True
a = ["hello"]
b = ["hello"]
print(a is b, a == b) # False True
Уведомление:
- is, is не сравнивает адреса памяти двух переменных
- ==, != сравнить значения двух переменных
- Две сравниваемые переменные указывают на неизменяемые типы (str и т. д.), тогда is, is и ==,! = точно эквивалентно.
- Две сравниваемые переменные указывают на типы с переменными адресами (list, dict, tuple и т. д.), тогда между ними есть разница.
3 Приоритет операции
- Унарные операторы лучше, чем бинарные. Например
3 ** -2
Эквивалентно3 ** (-2)
. - Сначала арифметические операции, затем операции сдвига и, наконец, операции с битами. Например
1 << 3 + 2 & 7
Эквивалентно(1 << (3 + 2)) & 7
. - Логические операции окончательно объединяются. Например
3 < 4 and 4 < 5
Эквивалентно(3 < 4) and (4 < 5)
.
4 Найдите все свойства и методы
Используйте метод dir(), чтобы найти свойства и методы типа int ниже
b = dir(int)
print(b)
# ['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__',
# '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__',
# '__float__', '__floor__', '__floordiv__', '__format__', '__ge__',
# '__getattribute__', '__getnewargs__', '__gt__', '__hash__',
# '__index__', '__init__', '__init_subclass__', '__int__', '__invert__',
# '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__',
# '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__',
# '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__',
# '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__',
# '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__',
# '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__',
# '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__',
# 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag',
# 'numerator', 'real', 'to_bytes']
Среди них есть функция bit_length, которая находит двоичное представление целого числа и возвращает его длину.
a = 1031
print(bin(a)) # 0b10000000111
print(a.bit_length()) # 11
5 тип и isinstance3
-
type()
Подклассы не считаются типом суперкласса, и отношения наследования не учитываются. -
isinstance()
Он будет думать, что подкласс является своего рода родительским классом, и рассмотрит отношения наследования.
6-битная арифметика
оператор | название | Пример |
---|---|---|
~ |
побитовое отрицание | ~4 |
& |
побитовое И | 4 & 5 |
` | ` | побитовое ИЛИ |
^ |
Побитовое исключающее ИЛИ | 4 ^ 5 |
<< |
сдвиг влево | 4 << 2 |
>> |
переместить вправо | 4 >> 2 |
print(bin(4)) # 0b100
print(bin(5)) # 0b101
print(bin(~4), ~4) # -0b101 -5
print(bin(4 & 5), 4 & 5) # 0b100 4
print(bin(4 | 5), 4 | 5) # 0b101 5
print(bin(4 ^ 5), 4 ^ 5) # 0b1 1
print(bin(4 << 2), 4 << 2) # 0b10000 16
print(bin(4 >> 2), 4 >> 2) # 0b1 1
6.1 Исходное, инверсное и дополнение
Существует три разных представления двоичного кода: исходный код, дополнительный код и дополнительный код.Компьютер использует дополнительный код для его представления.
исходный код: это его двоичное представление (обратите внимание, что есть знаковый бит).
00 00 00 11 -> 3
10 00 00 11 -> -3
дополнение: Обратный код положительного числа является исходным кодом, обратный код отрицательного числа означает, что бит знака остается неизменным, а остальные биты инвертируются (соответствует побитовой инверсии положительных чисел).
00 00 00 11 -> 3
11 11 11 00 -> -3
дополнять: Дополнением положительного числа является исходный код, а дополнением отрицательного числа является дополнение +1.
00 00 00 11 -> 3
11 11 11 01 -> -3
знаковый бит: старший бит является битом знака, 0 для положительных чисел и 1 для отрицательных чисел. Знаковый бит также участвует в побитовой операции.
6.2 Побитовые операции
- Побитовое НЕ ~
~ 1 = 0
~ 0 = 1
~
Пучокnum
Все 0 и 1 в дополнении , инвертируются (0 становится 1, 1 становится 0) Знаковый бит целого числа со знаком равен~
Операция также отменяется.
00 00 01 01 -> 5
~
---
11 11 10 10 -> -6
11 11 10 11 -> -5
~
---
00 00 01 00 -> 4
- побитовая операция И &
1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0
1, только если оба соответствующих бита равны 1
00 00 01 01 -> 5
&
00 00 01 10 -> 6
---
00 00 01 00 -> 4
- Побитовое ИЛИ |
1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0
1 всякий раз, когда один из двух соответствующих битов равен 1
00 00 01 01 -> 5
|
00 00 01 10 -> 6
---
00 00 01 11 -> 7
- Побитовая операция XOR ^
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
1, только если два соответствующих бита различны
00 00 01 01 -> 5
^
00 00 01 10 -> 6
---
00 00 00 11 -> 3
Свойства операции XOR: выполнение коммутативных и ассоциативных законов
A: 00 00 11 00
B: 00 00 01 11
A^B: 00 00 10 11
B^A: 00 00 10 11
A^A: 00 00 00 00
A^0: 00 00 11 00
A^B^A: = A^A^B = B = 00 00 01 11
- Побитовая операция сдвига влево
num << i
будетnum
Двоичное представление смещено влевоi
битовое значение.
00 00 10 11 -> 11
11 << 3
---
01 01 10 00 -> 88
- Побитовая операция сдвига вправо >>
num >> i
будетnum
Двоичное представление сдвинуто вправоi
битовое значение.
00 00 10 11 -> 11
11 >> 2
---
00 00 00 10 -> 2
6.3 Использование битовых операций для быстрых вычислений
пройти через<<
,>>
Быстро вычислить кратные 2 проблемы.
n << 1 -> 计算 n*2
n >> 1 -> 计算 n/2,负奇数的运算不可用
n << m -> 计算 n*(2^m),即乘以 2 的 m 次方
n >> m -> 计算 n/(2^m),即除以 2 的 m 次方
1 << n -> 2^n
пройти через^
Быстро поменять местами два целых числа.
пройти через^
Быстро поменять местами два целых числа.
a ^= b
b ^= a
a ^= b
пройти черезa & (-a)
Быстрый доступa
является целым числом в 1 позиции в конце.
00 00 01 01 -> 5
&
11 11 10 11 -> -5
---
00 00 00 01 -> 1
00 00 11 10 -> 14
&
11 11 00 10 -> -14
---
00 00 00 10 -> 2
6.4 Реализация целочисленных наборов с использованием битовых операций
Двоичное представление числа можно рассматривать как набор (0 означает, что его нет в наборе, 1 означает, что он есть в наборе).
например, коллекция{1, 3, 4, 8}
, что может быть выражено как01 00 01 10 10
Соответствующие битовые операции также можно рассматривать как операции над множествами.
Операции над элементами и множествами:
a | (1<<i) -> 把 i 插入到集合中
a & ~(1<<i) -> 把 i 从集合中删除
a & (1<<i) -> 判断 i 是否属于该集合(零不属于,非零属于)
Операции между наборами:
a 补 -> ~a
a 交 b -> a & b
a 并 b -> a | b
a 差 b -> a & (~b)
Примечание. Целые числа существуют в памяти в форме дополнения, и вывод, естественно, выводится в виде дополнения.
[Пример] Язык C# выводит отрицательные числа.
class Program
{
static void Main(string[] args)
{
string s1 = Convert.ToString(-3, 2);
Console.WriteLine(s1);
// 11111111111111111111111111111101
string s2 = Convert.ToString(-3, 16);
Console.WriteLine(s2);
// fffffffd
}
}
[Пример] Pythonbin()
вывод.
print(bin(3)) # 0b11
print(bin(-3)) # -0b11
print(bin(-3 & 0xffffffff))
# 0b11111111111111111111111111111101
print(bin(0xfffffffd))
# 0b11111111111111111111111111111101
print(0xfffffffd) # 4294967293
0b11
-0b11
0b11111111111111111111111111111101
0b11111111111111111111111111111101
4294967293
Насколько это подрывное познание, мы можем видеть из результатов:
- Питон
bin
Отрицательное число (десятичное представление), выход — двоичное представление его исходного кода плюс знак минус, гигантская яма. - Целые числа в Python хранятся в форме дополнения до двух.
- Целые числа в Python имеют неограниченную длину и не могут переполняться.
Таким образом, чтобы получить дополнение отрицательного числа (десятичное представление), его необходимо вручную объединить с шестнадцатеричным числом.0xffffffff
Выполните побитовую операцию И, а затем передайте ееbin()
Результатом является дополнительное представление отрицательного числа.