PDA

Просмотр полной версии : Матчасть (Битовые операции)


Foks
09.05.2010, 00:18
В общем, вижу, много вопросов задается на одни и те же темы, решил создать. Просьба писать только по существу - дополнять эти мануалы, никакого обсуждения/флуда.
Начну с того, что уже написал в другой теме.

И так, некоторые поля в файле конфигурации (mangosd.conf, realmd.conf) являются битовыми масками (bitmask) -UsedProcessors и т.д. Так как многие новички не понимают, что это такое, объясню. Чтобы понять что это такое, нужно научиться переводить числа между разными системами исчисления. Для начала научимся переводить из любой системы в нашу привычную - десятичную. Именно в десятичной системе записываются все параметры в mangosd.conf.

Битовая операция (http://ru.wikipedia.org/wiki/Битовые_операции) в программировании — некоторые операции над цепочками битов. В программировании, как правило, рассматриваются лишь некоторые виды этих операций: логические побитовые операции и битовые сдвиги. Битовые операции применяются в языках программирования и цифровой технике, изучаются в дискретной математике.

Чтобы перевести число из любой системы счисления в десятичную нужно:
Каждую исходную цифру умножить на основу системы, поднесенную в степень - номер цифры начиная с нуля, считать СПРАВА, и полученные числа просуммировать.
Примеры:
Из двоичной 10111: 1*(2^0)+1*(2^1)+1*(2^2)+0*(2^3)+1*(2^4)
Из троичной 122012: 2*(3^0)+1*(3^1)+0*(3^2)+2*(3^3)+2*(3^4)+1*(3^5)
Из восьмиричной 765: 5*(8^0)+6*(8^1)+7*(8^2)
---------
Битовая маска - число в двоичной системе.
В параметре UsedProcessors каждый бит указывает включено ли ядро. 0 - означает ядро выключено, 1 означает ядро включено. Нам нужно включить четыре ядра - нужно число 1111
1*(2^0)+1*(2^1)+1*(2^2)+1*(2^3)=1*1 + 1*2 + 1*4 + 1*8=1+2+4+8=15.
Значит, UsedProcessors=15.
Или, например, нужно включить только 2 ядра: нужно число 11
1*(2^0)+1*(2^1)=1*1 + 1*2=1+2=3.
Значит, UsedProcessors=3.
---------
В каждой системе счисления столько цифр, какая у неё основа
2: 2 цифры: 0, 1
3: 3 цифры: 0, 1, 2
5: 5 цифер: 0, 1, 2, 3, 4
8: 8 цифер: 0, 1, 2, 3, 4, 5, 6, 7
16: 16 цифер: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F
a,b,c,d,e,f - тоже цифры. Просто в 16-ричной системе должно быть 16 цифр, а мы знаем только 10. Поэтому берут, что:
A = 10
B = 11
C = 12
D = 13
E = 14
F = 15
----
Из 16-ричной системы перевести в нашу (десятичную) переводим точно так же:
Число 18AF42C
12*(16^0) + 2*(16^1) + 4*(16^2) + 15*(16^3) + 10*(16^4) + 8*(16^5) + 1*(16^6) = 25883692
-------------
Между 2-, 8-, 10-, 16-ричными системами умеет переводить калькулятор винды в режиме "Инженерный". Сверху слева при этом выбирается текущая система:
Bin - двоичная
Oct - восьмиричная
Dec - десятичная (наша)
Hex - шестнадцатиричная

lovepsone
02.02.2012, 17:15
У меня назрел вопрос! А как прочитать к примеру вот такой код 0x0002
Прочитав ваш мануал и потренировавшись я так понял это троичная форма, так как есть 2 и 0 (либо я не правильно понял)! А как понять что здесь обозначает x

Deamon
02.02.2012, 17:59
Это не троичная форма.
Троичная форма в доке была преведена просто как пример.
Это обычная 16-ричная форма. Об этом говорит префик "0x" перед числом.

lovepsone
02.02.2012, 18:34
Это не троичная форма.
Троичная форма в доке была преведена просто как пример.
Это обычная 16-ричная форма. Об этом говорит префик "0x" перед числом. Ясно, но все таки как перевести в обычное число? Может х знак умножения ?

Кот ДаWINчи
02.02.2012, 18:49
два, она и в Африке два. А здесь это два в шестнадцатеричной.

0x - префикс, который обозначает, что то что записано сразу за ним - 16-чное число и равно оно 0002, т.е. ДВА.
а в пхп !? вот читай - http://www.php.net/manual/ru/language.types.integer.php

Ясно, но все таки как перевести в обычное число?
чтобы перевести куда?

Присвой переменной и приведи переменную к целому числу. ПХП сам переведет.

Пример:

$a = 0x00020;

echo (int)$a;

и тебе напечатает - 32 (десятичное).

lovepsone
02.02.2012, 18:53
то есть 0x показывает на то что это 16-чное число и больше нечего ? А дальше 00020 можно самому подсчитать:
0*(16^0)+2*(16^1)+0*(16^2)+0*(16^3)+0*(16^4) = 32
Спасибо что не поленились мне все объяснить, из поста от Deamon, я плохо вчитался и не понял сути!

Sid
02.02.2012, 20:16
0*(16^0)+2*(16^1)+0*(16^2)+0*(16^3)+0*(16^4) = 32

Отвыкайте так делать. Шестнадцатеричная система счисления это основная система счисления для любого программиста. Поверьте если перестанете представлять ее как нечто нестандартное, то легко сможете в уме считать на ней :) Человеку навязали стереотип 10тичной системы - он к нему привык и считать по другому мозг не поворачивается, просто попробуйте повернуть и все поймете.

Foks
16.02.2012, 01:11
Немного почистил тему от флуда.