Найти - Пользователи
Полная версия: Как научиться разбираться в таких функциях?
Начало » Python для новичков » Как научиться разбираться в таких функциях?
1
ingfa_1981
Конкретно не понятно что за тип имеет
0x3f
0x1 итд. итп.
зачем смещают вправо (tmp >> 8 & 0x3f) почему именно на это число 8 и применяют & – битовый оператор И?
Можно в теорию ткнуть.
Речь идет о модуле ad9833 но не суть, важна именно теория.




 MCLK = 25*10**6
def convert_freq(freq):
    tmp = int(freq * 2 ** 28 / MCLK)
    print([tmp >> 8 & 0x3f | 0x1 << 6, tmp & 0xff,tmp >> 22 | 0x1 << 6, tmp >> 14 & 0xff])
    return bytes([tmp >> 8 & 0x3f | 0x1 << 6, tmp & 0xff,
                  tmp >> 22 | 0x1 << 6, tmp >> 14 & 0xff])
print (convert_freq(1.5))
py.user.next
ingfa_1981
Конкретно не понятно что за тип имеет
0x3f
0x1 итд. итп.
Тип int. Это шестнадцатеричная форма записи целого числа. Например, 16 == 0x10 .

ingfa_1981
зачем смещают вправо (tmp >> 8 & 0x3f) почему именно на это число 8 и применяют & – битовый оператор И?
По приоритетам операции идут так:
От высокого приоритета к низкому
>>
&
^
|
Так можно расставить скобки мысленно
tmp >> 8 & 0x3f
превращается в
(tmp >> 8) & 0x3f
Или вот эту берём
tmp >> 8 & 0x3f | 0x1 << 6
превращается в
((tmp >> 8) & 0x3f) | (0x1 << 6)
Ну, и дальше сами операции:
У тебя есть десятичное число 5. Если его перевести в двоичную форму, получится двоичное число 101. У тебя есть десятичное число 6. Если его перевести в двоичную форму, получится двоичное число 110.
И вот мы побитово применяем операции к этим двум числам:
AND:
5dec & 6dec = 101bin & 110bin = 100bin = 4dec

OR:
5dec | 6dec = 101bin | 110bin = 111bin = 7dec

RSHIFT:
5dec >> 1dec = 101bin >> 1dec = 10bin = 2dec

LSHIFT:
5dec << 1dec = 101bin << 1dec = 1010bin = 10dec

XOR:
5dec ^ 6dec = 101bin ^ 110bin = 011bin = 3dec
Дальше откуда появляются вот эти числа в шестнадцатеричном виде:
1 hex =  1 dec = 0001 bin
2 hex = 2 dec = 0010 bin
3 hex = 3 dec = 0011 bin
4 hex = 4 dec = 0100 bin
5 hex = 5 dec = 0101 bin
6 hex = 6 dec = 0110 bin
7 hex = 7 dec = 0111 bin
8 hex = 8 dec = 1000 bin
9 hex = 9 dec = 1001 bin
A hex = 10 dec = 1010 bin
B hex = 11 dec = 1011 bin
C hex = 12 dec = 1100 bin
D hex = 13 dec = 1101 bin
E hex = 14 dec = 1110 bin
F hex = 15 dec = 1111 bin
0x3f
0x3 hex = 0011 bin
0xf hex = 1111 bin

0x3f hex = 0011 1111 bin
0xff
0xf hex = 1111 bin
0xf hex = 1111 bin

0xff hex = 1111 1111 bin
0xabcd
0xa hex = 1010 bin
0xb hex = 1011 bin
0xc hex = 1100 bin
0xd hex = 1101 bin

0xabcd hex = 1010 1011 1100 1101 bin

Пример
  
tmp = 12345
out = tmp >> 12 & 0x23
print(out)
12345 dec = 0x3039 hex

0x3039
0x3 hex = 0011 bin
0x0 hex = 0000 bin
0x3 hex = 0011 bin
0x9 hex = 1001 bin

0x3039 hex = 0011 0000 0011 1001 bin

0x3039 hex >> 12 dec = 0011 0000 0011 1001 bin >> 12 dec = 0011 bin = 0x3 hex

0x3 hex & 0x23 hex

0x23
0x2 hex = 0010 bin
0x3 hex = 0011 bin

0x23 hex = 0010 0011 bin

0x3 hex & 0x23 hex = 0011 bin & 0010 0011 bin = 0000 0011 bin & 0010 0011 bin = 0011 bin = 0x3 hex = 3 dec
На экран выведется число 3.



tags: bitwise bin hex
ingfa_1981
А на выходе если не преобразовывать в bytes получается список из int

если преобразовать в байты и распечатать добавляется значек “@”, что он означает, это такой разделитель?
b'@\x10@\x00'
правильно ли я понимаю общая длина получается 16 bit?
xam1816
ingfa_1981
Речь идет о модуле ad9833 но не суть, важна именно теория.
 MCLK = 25*10**6
def convert_freq(freq):
    tmp = int(freq * 2 ** 28 / MCLK)
    print(tmp) # значение которое нужно записать в регистр
    print([tmp >> 8 & 0x3f | 0x1 << 6, tmp & 0xff,tmp >> 22 | 0x1 << 6, tmp >> 14 & 0xff]) # здесь подготовка слов для отправки
    return [format(x,'08b') for x in [tmp >> 8 & 0x3f | 0x1 << 6, tmp & 0xff,tmp >> 22 | 0x1 << 6, tmp >> 14 & 0xff]]
n = convert_freq(1.5)
# регистр частоты имеет разрядность 28 бит это два слова по 16
print(n[0]+n[1])    # первые два бита выбор частоты(freq0), и 14 бит запись в младшие биты - 1слово
print(n[2]+ n[3]) # первые два бита выбор частоты(freq0),и 14 бит запись в старшие биты - 2 слово

вывод

16
[64, 16, 64, 0]
0100000000010000
0100000000000000

Process finished with exit code 0
py.user.next
ingfa_1981
если преобразовать в байты и распечатать добавляется значек “@”, что он означает, это такой разделитель?
Объект класса bytes в питоне представляют из себя последовательность целых чисел.
  
>>> b'@'
b'@'
>>> b'@'[0]
64
>>> hex(64)
'0x40'
>>> b'\x40'
b'@'
>>> b'\x40' == b'@'
True
>>>
Поэтому там нет никаких значков и разделителей. Это просто некоторые коды имеют графическое представление.

Пример
  
>>> b'\xff ,\x20, \x09 \x40 \xab'
b'\xff , , \t @ \xab'
>>> 
>>> list(_)
[255, 32, 44, 32, 44, 32, 9, 32, 64, 32, 171]
>>>
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB