2013-02-24 1 views
0

Это довольно простой вопрос, и я уверен, что есть легкий ответ на него, но я не знаю, какой поисковый запрос я должен использовать для поиска ответа. Вот оно:Почему десятичные числа используются в битмасках?

Я пытаюсь понять, как работают битмаски. В системах Linux есть:

struct stat 

, который имеет элемент st_mode, который используется, чтобы определить, является ли файл проверяемого обычный файл, каталог, символическая ссылка, и другие. Таким образом, можно написать простую функцию, которую можно передать имя и получить, является ли или нет имя каталога:

16 int isadir(char *name) 
17 /* 
18 *  calls stat, then masks the st_mode word to obtain the 
19 *  filetype portion and sees if that bit pattern is the 
20 *  pattern for a directory 
21 */ 
22 { 
23   struct stat info; 
24 
25   return (stat(name,&info)!=-1 && (info.st_mode & S_IFMT) == S_IFDIR); 
26 } 

Когда я смотрю на битовую, я вижу, это представляется следующим образом:

/* Encoding of the file mode. */ 

#define __S_IFMT  0170000 /* These bits determine file type. */ 

Я думал, что битмаски могут иметь только 0 и 1 сек. Почему в маске 7?

+4

Мое предположение было бы константой, выраженной в восьмеричном (основание 8) –

+4

Все номера хранятся внутри как двоичные числа. Ведущий 0 указывает на восьмеричность. Чуть проще для людей вводить и читать. При компиляции он заканчивается двоичным. – QuentinUK

+0

Это важный момент, если вы собираетесь писать или читать c. Ведущие нули * значительны * в целочисленных константах, когда они устанавливают базу. Аналогично, ведущие '0x' или' 0X', которые обозначают шестнадцатеричный (база 16). – dmckee

ответ

3

Байт имеет 8 бит и может быть выражен в десятичной (от 0 до 255), восьмеричной (от 000 до 377), шестнадцатеричной (от 00 до FF) или двоичной (от 00000000 до 11111111). Давайте число битов, от бита 0 до бита 7:


На самом деле число может быть выражено в любой базе, но в основном восьмеричной и шестнадцатеричной удобны, когда один хочет, чтобы разбить число на куски; экспрессирующих байт в восьмеричном легче, как

z y x 

х это биты от 0 до 2, у это биты с 3 по 5 и г это биты 6 и 7.

Таким образом, в вашем Exemple , 017 восьмеричное число

0 1 7 
00 001 111 

числа, выраженные в восьмеричной базовой (8) базы легче быть преобразованы в двоичный. (в гекса, который будет 0F).

В C (...) восьмеричные цифры начинаются с начального нуля (0 ...), а в шестнадцатеричном порядке начинаются с 0x (0x ...). Как проще визуализировать биты чисел, выраженных в восьмеричной,

022 & 017 

дает в двоичном

"00 010 010" & 
"00 001 111" 

результат можно обнаружить легко

"00 000 010" 

В десятичной системе, что бы be 18 & 15.

+0

Отлично! Спасибо за подробное объяснение, это очень помогает. Похоже, я кое-что читаю, чтобы делать на числовых системах. – Nate

4

Номера, начинающиеся с ведущего 0, являются восьмеричными числами - это стандартный синтаксис Си.

И они могут быть полезны для битмаски, особенно для представления разрешений Unix.

Смежные вопросы