Índice:
Vídeo: CS50 - Semana 5 - Aula (2/2) - Introdução à Ciência da Computação 2024
As variáveis C ++ são armazenadas internamente como os chamados números binários. Os números binários são armazenados como uma seqüência de valores de 1 e 0 conhecidos como bits. Na maioria das vezes, você realmente não precisa lidar com quais bits particulares você usa para representar números. Às vezes, no entanto, é prático e conveniente para mexer com números no nível de bits - então C ++ fornece um conjunto de operadores para esse propósito.
Os chamados operadores lógicos bitwise operam em seus argumentos no nível de bits. Para entender como funcionam, primeiro examine como os computadores armazenam variáveis.
O sistema de números decimais
Os números que você conheceu desde o momento em que você pode contar pela primeira vez em seus dedos são conhecidos como números decimais porque estão baseados no número 10. Em geral, o programador expressa as variáveis C ++ como números decimais. Assim, você poderia especificar o valor de var como (digamos) 123, mas considere as implicações.
Um número como 123 refere-se a 1 * 100 + 2 * 10 + 3 * 1. Todos esses números de base - 100, 10 e 1 - são poderes de 10.
123 = 1 * 100 + 2 * 10 + 3 * 1
Expresso de maneira ligeiramente diferente (mas equivalente), 123 parece assim:
123 = 1 * 10 < 2 + 2 * 10 1 + 3 * 10 0 Lembre-se de que
qualquer número para a potência zero é 1. Outros sistemas de números
Bem, ok, usando 10 como base (ou
base ) de nosso sistema de contagem, provavelmente deriva desses 10 dedos humanos, as ferramentas de contagem originais. Uma base alternativa para um sistema de contagem poderia ter sido tão fácil de ter sido 20.
Se o nosso esquema de numeração tivesse sido inventado por cães, pode basear-se em 8 (um dígito de cada pata está fora da vista na parte traseira da perna). Matematicamente, um sistema octal teria funcionado igualmente: 123
10 = 1 * 8 2 + 7 * 8 1 < + 3 * 8 0 = 173 8 Os 10 e 8 pequenos referem-se ao sistema de numeração, 10 para decimal (base 10) e 8 para octal (base 8). Um sistema de contagem pode usar qualquer base positiva. O sistema do número binário
Os computadores têm essencialmente dois dedos. Os computadores preferem contar usando a base 2. O número 123
10
seria expresso dessa maneira: 123 10
= 0 * 2 7 + 1 * 2 < 6 + 1 * 2 5 + 1 * 2 4 + 1 * 2 3 + 0 * 2 2 + 1 * 2 1 + 1 * 2 0 123 10 = 0 * 128 + 1 * 64 + 1 * 32 + 1 * 16 + 1 * 8 + 0 * 4 + 1 * 2 + 1 * 1 = 01111011 2 A convenção de computador expressa números binários usando 4, 8, 16, 32 ou mesmo 64 dígitos binários, mesmo que os dígitos iniciais sejam 0.Isso também é devido à forma como os computadores são construídos internamente. Como o termo dígito
refere-se a um múltiplo de 10, um
dígito binário é chamado de bit (uma abreviatura de dígito binário >). Um byte é composto de 8 bits. (Chamar um dígito binário a byte-it não parece ser uma boa idéia.) A memória geralmente é medida em bytes (como os rolos são medidos em unidades de dúzia de padeiro). Com uma base tão pequena, você precisa usar um grande número de bits para expressar números. Os seres humanos não querem o incômodo de usar uma expressão como 011110112 para expressar um valor tão mundano como 123 10
. Os programadores preferem expressar números usando um número par de bits. O sistema octal - que é baseado em 3 bits - foi o sistema binário padrão nos primeiros dias de C. Vemos um vestígio disso ainda hoje - uma constante que começa com um 0 é assumido como octal em C ++. Assim, a linha: cout << "0173 =" << 0173 << endl; produz a seguinte saída: 0173 = 123
No entanto, octal foi quase completamente substituído pelo sistema
hexadecimal
, que é baseado em dígitos de 4 bits.
Hexadecimal usa os mesmos dígitos para os números de 0 a 9. Para os dígitos entre 9 e 16, o hexadecimal usa as primeiras seis letras do alfabeto: A para 10, B para 11 e assim por diante. Assim, 123
10 torna-se 7B 16, assim: 123 = 7 * 16 1 + B (ou seja, 11) * 16 0
= 7B 16 Os programadores preferem expressar números hexadecimais em múltiplos de 4 dígitos hexadecimais mesmo quando o dígito principal em cada caso é 0. Finalmente, quem deseja expressar um número hexadecimal como 7B 16 usando um subíndice? Os terminais nem sequer
suportam subscritos
. Mesmo em um processador de texto, é um arrasto para mudar as fontes para e do modo de subíndice apenas para digitar dois dígitos ruins. Portanto, os programadores (sem tolos, eles) usam a convenção de começar um número hexadecimal com um 0x. Assim, 7B torna-se 0x7B. Usando esta convenção, o número hexadecimal 0x7B é igual a 123 decimal, enquanto 0x123 hexadecimal é igual a 291 decimal. O snippet de código cout << "0x7B =" << 0x7B << endl; cout << "0x123 =" << 0x123 << endl; produz a seguinte saída: 0x7B = 123 0x123 = 291
Você pode usar todos os operadores matemáticos em números hexadecimais da mesma forma que você os aplicaria a números decimais.
Se você realmente quiser, você pode escrever números binários em C ++ '14 usando o prefixo '0b'. Assim, 123 torna-se 0b01111011.