Я намагаюся краще зрозуміти структуру двійкових файлів. Я написав наступний код для запису в беззнакові цілі числа 8 біт у двійковий файл у MATLAB (у Windows)
x = uint8(2^3); % 00010000
fid = fopen("test.bin","w");
fwrite(fid, x);
fclose(fid);
Потім я перейшов до шестнадцатеричного редактора і відкрив файл. Як і очікувалося, я бачу
Тепер я намагаюся написати двобайтовий довгий тип uint16
x = uint16(2^8); % 0000000100000000
fid = fopen("test.bin","w");
fwrite(fid, x,"uint16");
fclose(fid);
Замість того щоб бачити 01 00, я просто бачу 00
Відповіді:
0 для відповіді № 1Загалом (0x10 означає 10 як шістнадцяткове число, яке є десятковим числом 16):
2^3 = 2³ = 8 = 0x08
2^4 = 16 = 0x10
Я не думаю, що ви робите те, що ви думаєте, що ви робите. 2 ^ 3 не 2 * 2 * 2 в C (і, ймовірно, Matlab з ваших результатів).
Рішення: (у C): 2 << 3 = 2 * (2 * 2 * 2) = 10000 = 16 = 0x10
Пояснення:
У C (не знаю про Matlab):
2 << 3 означає: 10 << 000 = 10000 = 16 = 0x10.
Кожен << 1 означає "додавання нуля за двійковим числом", що дорівнює еквіваленту до 2 (* 2). Це також працює в іншому напрямку >> 1 те ж саме, що і поділ на 2 (/ 2).
2 ^ 3 означає не 2³ (Експонента), але BINARY AND.
Ти робиш:
2 is binary 10
3 is binary 11
11 & 10 = 10
10
11
--
10
Один під одним означає Один, нуль під одним означає 0. Один і Один - Один. Zero і One - Zero. Або більш формальний: (true ^ false) = false.
Ймовірно, чому 2 ^ 8 не працює.
0010 (2) & 1000 (8) = 0000
0010
1000
----
0000
Немає 1 під 1, так це все 0.