Форум сайта python.su
Конкретно не понятно что за тип имеет
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))
Отредактировано ingfa_1981 (Фев. 21, 2022 13:46:56)
Офлайн
ingfa_1981Тип int. Это шестнадцатеричная форма записи целого числа. Например, 16 == 0x10 .
Конкретно не понятно что за тип имеет
0x3f
0x1 итд. итп.
ingfa_1981По приоритетам операции идут так:
зачем смещают вправо (tmp >> 8 & 0x3f) почему именно на это число 8 и применяют & – битовый оператор И?
>>
&
^
|
tmp >> 8 & 0x3f
превращается в
(tmp >> 8) & 0x3f
tmp >> 8 & 0x3f | 0x1 << 6
превращается в
((tmp >> 8) & 0x3f) | (0x1 << 6)
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
Отредактировано py.user.next (Фев. 22, 2022 12:18:13)
Офлайн
А на выходе если не преобразовывать в bytes получается список из int
если преобразовать в байты и распечатать добавляется значек “@”, что он означает, это такой разделитель?
b'@\x10@\x00'
правильно ли я понимаю общая длина получается 16 bit?
Офлайн
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
Отредактировано xam1816 (Фев. 22, 2022 11:40:41)
Офлайн
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] >>>
Офлайн