Где узнать про «бит»? - PullRequest
5 голосов
/ 23 мая 2011

Я пытаюсь найти некоторые книги или ресурсы, подробно рассказывающие о битах, чтобы, например, я смог перевести число (например, 16) в биты.В настоящее время я учусь в старшей школе, и всякий раз, когда я читаю книги по программированию, я понимаю почти все, кроме побитовых / побитовых операторов.Я просто не знаю, как это работает и почему люди даже изобретают биты и байты :(. Поэтому я надеюсь, что вы, ребята, можете дать мне несколько советов по ресурсам, рассказывающих о том, как преобразовать число / символы в биты.

Спасибо за ответ на мой вопрос и хорошего дня!

Ответы [ 9 ]

8 голосов
/ 23 мая 2011

Попробуйте поискать в двоичной арифметике. Вот довольно хорошая статья , чтобы вы начали.

5 голосов
/ 23 мая 2011

http://en.wikiversity.org/wiki/Bitwise_operators

http://en.wikipedia.org/wiki/Binary_numbers

Как только вы научитесь представлять числа в базе 2 (двоичные или «биты»), побитовые операторы достаточно просты для понимания.

Я просто приведу простой пример:

Пусть m = 31532 = 111101100101100 и n = 12325 = 11000000100101.

Тогда результат n & m (побитовое И- двоичный оператор):

(если n (i) и m (i) оба равны 1, то результат равен 1, 0 в противном случае)

111101100101100
011000000100101
===============
011000000100100

результат n |m (побитовое ИЛИ - бинарный оператор):

(если n (i) и m (i) равны 0, то результат равен 0, 1 в противном случае)

111101100101100
011000000100101
===============
111101100101101

результатиз n ^ m (битовое исключающее ИЛИ - бинарный оператор):

(если n (i) и m (i) равны 1, НО НЕ ОБА, то результат равен 1, 0 в противном случае)

111101100101100
011000000100101
===============
100101100001001

результат ~ n (побитовое НЕ - унарный оператор):

(если n (i) = 1, то результат равен 0, 1 в противном случае)

111101100101100
===============
000010011010011

пусть k = 3, результат n >> k (битовый сдвиг вправо):

111101100101100
===============
000111101100101

Они просто сместились вправо k = 3 раза.Это эффективно делит число на 2 ^ k = 8.Он обычно используется компилятором как оптимизация.

и наоборот, пусть k = 3, результат n << k (сдвиг влево по битам) равен </p>

111101100101100
===============
101100101100000

Они просто сместились в сторонуосталось к = 3 раза.Это эффективно умножает число на 2 ^ k = 8.Здесь следует обратить внимание на то, что 32-битное целое число может содержать до 2 ^ 32-1, произошло арифметическое переполнение, то есть старшие k бит были обрезаны.

Вы просто должны внимательно их просмотретьи выясните эти шаблоны.

Они важны в программировании, потому что они обычно используются при установке / очистке значений флага.

, поскольку int32 имеет 32 двоичных цифры, он может содержать до 32 различных типовлогических флагов (либо 0 для false, либо 1 для true)

Я думаю, что это об этом.Они довольно интуитивно понятны.

5 голосов
/ 23 мая 2011

Ваша проблема не связана с кодированием или каким-либо конкретным языком программирования, а больше с математикой, особенно с алгеброй и системами счисления.Затем следующим этапом станут основы архитектуры процессора x86, после чего вы сможете перейти к языку программирования.

Кстати: обычно книги о вирусах для x86 очень хорошо начинают понимать, как работает процессор, но без понимания base-2 и base-16 систем вы не получите от них много.

3 голосов
/ 23 мая 2011

Нет никакой разницы между ними, так как я не чувствую, что их можно сравнивать.Бит был «изобретен», потому что компьютеры знают только два состояния: включено (1) или выключено (0).Байт просто 8 бит.Я не знаю ни одной книги, которая полностью посвящена обсуждению бита или байта, но если вы посмотрите на книги о логическом дизайне, цифровых основах или любую книгу по аппаратной архитектуре, вы найдете больше информации о битах и ​​о том, как они используются.,Язык ассемблера также имеет дело с битами, намного превосходящими языки более высокого уровня, так что вы можете захотеть посмотреть и на это.

2 голосов
/ 23 мая 2011

Одна из лучших книг, которые я когда-либо читал по двоичной математике и сдвигу битов, - это Восторг Хакера. Это практически книга, касающаяся супероптимизации. Я настоятельно рекомендую прочитать его, и если материал слишком сложен, работайте очень медленно. Раньше мне приходилось переписывать стандартные библиотечные функции, такие как strlen () для хобби, и эта книга спасла мне жизнь.

2 голосов
/ 23 мая 2011

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

Есть несколько страшных хитрых приемов для работы с битовыми полями и двоичными представлениями чисел ;из заголовка stb.h :

int stb_bitcount(unsigned int a)
{
   a = (a & 0x55555555) + ((a >>  1) & 0x55555555); // max 2
   a = (a & 0x33333333) + ((a >>  2) & 0x33333333); // max 4
   a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits
   a = (a + (a >> 8)); // max 16 per 8 bits
   a = (a + (a >> 16)); // max 32 per 8 bits
   return a & 0xff;
}

unsigned int stb_bitreverse8(unsigned char n)
{
   n = ((n & 0xAA) >> 1) + ((n & 0x55) << 1);
   n = ((n & 0xCC) >> 2) + ((n & 0x33) << 2);
   return (unsigned char) ((n >> 4) + (n << 4));
}

unsigned int stb_bitreverse(unsigned int n)
{
  n = ((n & 0xAAAAAAAA) >>  1) | ((n & 0x55555555) << 1);
  n = ((n & 0xCCCCCCCC) >>  2) | ((n & 0x33333333) << 2);
  n = ((n & 0xF0F0F0F0) >>  4) | ((n & 0x0F0F0F0F) << 4);
  n = ((n & 0xFF00FF00) >>  8) | ((n & 0x00FF00FF) << 8);
  return (n >> 16) | (n << 16);
}

Просто потрясающе.:)

1 голос
/ 23 мая 2011

Все в мире компьютеров может быть представлено только строкой «0» и «1».Например, общий тип int имеет 32 бита, длинный тип long имеет 64 бита, n-битный тип может представлять число от 0 до 2 ^ n-1.

Кроме того, битовые операции, такие как «<<», «>>», «&» или «|»выполняются быстрее, чем арифметические операции на компьютере, потому что для этого используются аппаратные средства.И многие коды могут быть оптимизированы в соответствии с этим.

Преобразуйте int в двоичное, сначала вы должны знать, что любое число может быть представлено комбинацией 2 ^ 0,2 ^ 1,2 ^ 2 .... 2 ^ k: like 6 = 2^ 2 + 2 ^ 1, 13 = 2 ^ 3 + 2 ^ 2 + 2 ^ 0 и т. Д., Тогда 6 и 13 можно записать 0110 и 1101. На самом деле это математическая проблема.

Если вы хотите узнать больше о битовых операциях, я думаю, что вы можете искать в Google или вики, а не здесь.

1 голос
/ 23 мая 2011

Чтобы ответить на часть вашего вопроса ...

Просто введите 16 to binary в поле поиска Google. Если вы чувствуете себя действительно смелым, вы можете набрать 16 to hex, чтобы получить ответ в шестнадцатеричном формате. :)

0 голосов
/ 23 мая 2011

Я бы предложил научиться программировать z80, PIC или другой микропроцессор.Тогда вы поймете, откуда биты и биты.Однако прежде чем сделать это, вы, возможно, захотите испачкаться цифровой электроникой.Причина, по которой биты существуют, заключается в том, что цифровая электроника имеет сигналы только с 2 значениями, а именно с включенным и выключенным, следовательно, с 1 и 0 или битом.

...