Commit 9c987a2a authored by Jomaro Rodrigues's avatar Jomaro Rodrigues

Close #23 and close #30

parent 2f2dade7
\documentclass{pet_apostila}
\usepackage{cmap}
\usepackage[T1]{fontenc}
\usepackage{booktabs}
\usepackage{times}
\title{Apostila de C}
\author{PET Computação UFPR}
......
......@@ -6,8 +6,8 @@
\chapter{Argumentos ARGV e ARGC}
Algumas vezes é necessário que um programa receba argumentos através da linha de comando. Um
argumento de linha de comando é o texto digitado após o nome de um programa executável (ex.: pkzip
arquivo1 ) arquivo1 é um argumento do programa executável pkzip).
argumento de linha de comando é o texto digitado após o nome de um programa executável (ex.: tar
-czf arquivo1) arquivo1 é um argumento do programa executável tar).
Para obter os argumentos da linha de comando, existem dois parâmetros que podem ser acrescentados
à função main de um programa em C, argc e argv. O parâmetro argc armazenará o número de argumentos
......
......@@ -91,9 +91,10 @@ arquivo. O segundo é uma string de formatos, listados na tabela ??.
Exemplo:
\begin{lstlisting}
FILE *fp; /* fp e um ponteiro para arquivo */
FILE *fp; // fp e um ponteiro para arquivo
if ((fp=fopen("teste.txt", "w")) == NULL) {
/* se não conseguiu criar arquivo ... */
// se não conseguiu criar arquivo ...
puts ("Nao posso criar o arquivo!"n");
exit(1);
}
......@@ -244,7 +245,7 @@ A função fgets lê uma string do arquivo fp especificado. A função fgets lê
caractere de nova linha seja lido ou tamanho-1 caracteres sejam lidos. Se uma nova linha é lida, o caracter
nova linha será adicionado ao final da string str.
Toda string lida por fgets é terminada pelo caracter nulo "0.
Toda string lida por fgets é terminada pelo caracter nulo \\0.
\subsection{Exercícios}
......@@ -376,7 +377,7 @@ Se a função fseek retornar zero, indica que houve sucesso na chamada à funç
diferente de zero indica uma falha.
\begin{lstlisting}
/* ... */
// ...
FILE *fp;
char ch;
......@@ -388,7 +389,7 @@ if ((fp=fopen("teste", "rb")) == NULL){
fseek(fp, 234, SEEK SET); // pode-se trocar o SEEK SET por 0
ch = getc(fp); // lê o 235o caracter
/* ... */
// ...
\end{lstlisting}
......
......@@ -73,10 +73,11 @@ As variáveis da linguagem C enquadram-se em uma das seguintes categorias:
\begin{description}
\item[Variáveis inteiras] que armazenam valores não-fracionais (ou seja, somente valores inteiros). Há dois tipos de variáveis inteiras:
\begin{description}
\item[variáveis inteiras com sinal] que podem conter valores positivos ou negativos;
\item[variáveis inteiras sem sinal] que só podem assumir valores positivos.
Operações matemáticas entre variáveis inteiras são, normalmente, muito rápidas.
\item[com sinal] que podem conter valores positivos ou negativos;
\item[sem sinal] que só podem assumir valores positivos.
\end{description}
Operações matemáticas entre variáveis inteiras são, normalmente, muito rápidas.
\item[Variáveis de Ponto Flutuante] que contém valores com uma parte fracional (ou seja, números reais).
......@@ -85,25 +86,25 @@ No geral, as operações matemáticas são mais lentas para este tipo de variáv
\begin{table}
\scriptsize
\begin{tabular}{|l|l|l|l|}
Tipo de Variável & Palavra Chave & Bytes & Valores Válidos \\
\begin{tabular}{|l|l|l|l|} \hline
Tipo de Variável & Palavra Chave & Bytes & Valores Válidos \\ \hline
Caracteres
& char & 1 & -128 a 127 \\
& char & 1 & -128 a 127 \\ \hline
Números inteiros curtos
& short & 2 & -32.768 a 32.767 \\
& short & 2 & -32.768 a 32.767 \\ \hline
Números inteiros
& int & 4 & -2.147.483.648 a 2.147.483.647 \\
& int & 4 & -2.147.483.648 a 2.147.483.647 \\ \hline
Caracteres não sinalizados
& unsigned char & 1 & 0 a 255 \\
& unsigned char & 1 & 0 a 255 \\ \hline
Números inteiros curtos sem sinal
& unsigned short & 2 & 0 a 65.535 \\
& unsigned short & 2 & 0 a 65.535 \\ \hline
Números inteiros sem sinal
& unsigned long & 4 & 0 a 4.294.967.295 \\
& unsigned long & 4 & 0 a 4.294.967.295 \\ \hline
Número de ponto flutuante com precisão simples
& float & 4 & 1,2E-38 a 3,4E38 \\
& float & 4 & 1,2E-38 a 3,4E38 \\ \hline
Número de ponto flutuante com precisão dupla
& double & 8 & 2,2E-308 a 1,8E308\\
& double & 8 & 2,2E-308 a 1,8E308\\ \hline
\end{tabular}
\caption{Tipos de dados numéricos em C.}
\end{table}
......@@ -123,10 +124,10 @@ tipo NomeVariavel;
Exemplo:
\begin{lstlisting}
/* tres variaveis inteiras */
// tres variaveis inteiras
int count, number, start;
/* variavel de ponto flutuante inicializada com um valor */
// variavel de ponto flutuante inicializada com um valor
float percent=15.3;
\end{lstlisting}
......
......@@ -158,14 +158,14 @@ são executadas.
\end{enumerate}
\begin{lstlisting}
/* Exemplo que demonstra o uso da instrucao for */
// Exemplo que demonstra o uso da instrucao for
#include <stdio.h>
void main ()
{
int contagem;
/* Imprime na tela os numeros de 1 a 10 */
// Imprime na tela os numeros de 1 a 10
for(contagem = 1; contagem != 10; contagem++)
printf("%d ", contagem);
......@@ -203,13 +203,13 @@ instruções do while são executadas e a execução volta à etapa 1.
\end{enumerate}
\begin{lstlisting}
/* Demonstra o uso da instrucao while */
// Demonstra o uso da instrucao while
#include <stdio.h>
void main ()
{
int contagem = 1;
/* Imprime na tela os numeros de 1 a 10 */
// Imprime na tela os numeros de 1 a 10
while ( contagem != 10 )
{
printf(" %d", contagem);
......@@ -247,14 +247,14 @@ senão, o ``loop'' é encerrado.
\end{itemize}
\begin{lstlisting}
/* Exemplo que demonstra o uso da instrucao do...while */
// Exemplo que demonstra o uso da instrucao do...while
#include <stdio.h>
void main ()
{
int contagem = 1;
/* Imprime na tela os numeros de 1 a 10 */
// Imprime na tela os numeros de 1 a 10
do {
printf(" %d", contagem);
contagem++;
......
/* calcula a media de n notas especificadas pelo usuario */
// calcula a media de n notas especificadas pelo usuario
#include <stdlib.h>
#include <stdio.h>
......@@ -7,25 +7,25 @@ int main() {
int i, n;
printf ("Digite o numero de notas: ");
scanf ("%d", &n); /* obtem o numero de notas */
scanf ("%d", &n); // obtem o numero de notas
if (n < 1) { /* verifica se o numero e valido */
if (n < 1) { // verifica se o numero e valido
printf ("Numero invalido! Deve ser maior que zero.\n");
return;
}
/* aloca memoria */
// aloca memoria
notas = (double*) malloc (n * sizeof(double));
for (i = 0; i < n; i++) { /* obtem as notas */
for (i = 0; i < n; i++) { // obtem as notas
printf ("Digite a %da. nota: ", i+1);
scanf ("%lf", (notas+i));
}
/* calcula a media das notas */
// calcula a media das notas
for (i = 0; i < n; i++)
media += *(notas+i);
media /= n;
printf ("A media das notas e: %f\n", media);
free (notas); /* desaloca a memoria alocada previamente */
free (notas); // desaloca a memoria alocada previamente
}
......@@ -6,8 +6,8 @@ int main (int argc, char *argv[]) {
for (i=1; i < argc; i++) {
if(system(argv[i])) {
printf("%s falha\n", argv[i]);
return -1; /* codigo de falha */
return -1; // codigo de falha
}
}
return 0; /* retorna o codigo de sucesso da operacao */
return 0; // retorna o codigo de sucesso da operacao
}
/* O programa que le arquivos e exibe-os na tela */
// O programa que le arquivos e exibe-os na tela
#include <stdio.h>
#include <stdlib.h>
......@@ -13,11 +13,11 @@ void main (int argc, char *argv[]) {
printf ("O arquivo nao pode ser aberto\n");
exit (1);
}
ch = getc(fp); /* le um caractere */
ch = getc(fp); // le um caractere
while (ch != EOF) {
/* repete enquanto nao for o final do arquivo */
printf("%c", ch); /* imprime caracter lido na tela */
ch = getc(fp); /* le proximo caracter */
// repete enquanto nao for o final do arquivo
printf("%c", ch); // imprime caracter lido na tela
ch = getc(fp); // le proximo caracter
}
fclose(fp); /*fecha o arquivo */
fclose(fp); //fecha o arquivo
}
/* O programa que le arquivos e exibe-os na tela */
// O programa que le arquivos e exibe-os na tela
#include <stdio.h>
#include <stdlib.h>
......@@ -16,14 +16,14 @@ int main (int argc, char *argv[]) {
exit (1);
}
ch = getc(fp) /* lê um caractere */
ch = getc(fp) // lê um caractere
while (ch != EOF){
/* repete enquanto nao for o final do arquivo */
printf("%c", ch); /* imprime caracter lido na tela */
ch = getc(fp); /* le proximo caracter */
// repete enquanto nao for o final do arquivo
printf("%c", ch); // imprime caracter lido na tela
ch = getc(fp); // le proximo caracter
}
fclose(fp); /* fecha o arquivo */
fclose(fp); // fecha o arquivo
return 0;
}
......
......@@ -4,8 +4,9 @@ void main() {
int contagem;
for(contagem = 0; contagem < 10; contagem++) {
if (contagem == 5) /* quando contagem for 5 */
break; /* interrompe o loop */
if (contagem == 5) // quando contagem for 5
break; // interrompe o loop
printf ("%d ", contagem);
}
printf ("\n");
......
#define PI 3.14159
#define TAM_MAX 30
/* inclusão de bibliotecas */
// inclusão de bibliotecas
#include <stdio.h>
#define PI 3.14159
......@@ -9,7 +9,7 @@ void main()
{
float perimetro;
int raio = 5; /* atribui valor 5 ao raio */
perimetro = PI*(2*raio); /* calcula o perimetro */
int raio = 5; // atribui valor 5 ao raio
perimetro = PI*(2*raio); // calcula o perimetro
printf("O perimetro da circunferencia de raio %d e %f", raio, perimetro);
}
#include <NomeBiblioteca> /* inclusão de bibliotecas */
#include <NomeBiblioteca> // inclusão de bibliotecas
#define NOMECONSTANTE Valor /* definição de constantes */
tipo função1(parâmetros); /* declaração de funções */
#define NOMECONSTANTE Valor // definição de constantes
tipo função1(parâmetros); // declaração de funções
tipo função2(parâmetros);
tipo Variável1; /* declaração de variáveis globais */
tipo Variável1; // declaração de variáveis globais
tipo Variável2;
int main() /* funçãoo principal */
int main() // função principal
{
declaração de variáveis;
comandos;
......
/* inclusao das bibliotecas */
// inclusao das bibliotecas
#include <stdio.h>
#include <stdlib.h>
/* defini,c~ao de constantes */
// definição de constantes
#define PI 3.14
/* declaracao de funcoes (prototipos) */
// declaracao de funcoes (prototipos)
float seno(int angulo);
/* declaracao de variaveis globais */
// declaracao de variaveis globais
float raio;
/* corpo de comandos principal */
// corpo de comandos principal
int main()
{
/* comandos */
// comandos
}
/* definição (implementacao) de funcoes */
// definição (implementacao) de funcoes
float seno(int angulo)
{
/* corpo da fun,c~ao */
// corpo da função
}
/* modulo imp fat.c */
// modulo imp fat.c
#include <stdio.h>
#include "fatorial.h"
......@@ -15,11 +15,11 @@ int main(){
}
/* cabecalho fatorial.h */
// cabecalho fatorial.h
long int fatorial(long int n);
/* modulo fatorial.c */
// modulo fatorial.c
#include <fatorial.h>
long int fatorial(long int n){
if (n < 2) return 1;
......
......@@ -7,13 +7,13 @@ int main(){
float exemplo[100];
int i;
/* verifica se houve erro na abertura do arquivo */
// verifica se houve erro na abertura do arquivo
if ((fp=fopen ("exemplo", "wb")) == NULL) {
printf ("O arquivo não pode ser aberto!"n");
êxit(1);
}
/* le a matriz inteira em um unico passo */
// le a matriz inteira em um unico passo
if (fread(&exemplo, sizeof(exemplo), 1, fp) != 1)
printf("Erro no arquivo!");
......
......@@ -4,8 +4,8 @@ void main() {
char c;
char *pc;
pc = &c; /* pc aponta para c */
pc = &c; // pc aponta para c
for (c = 'A'; c <= 'Z'; c++)
printf ("%c ", *pc); /* derreferencia o ponteiro */
printf ("%c ", *pc); // derreferencia o ponteiro
printf("\n");
}
......@@ -16,7 +16,7 @@ void main() {
long area;
struct retang quadro;
/* recebe as coordenadas */
// recebe as coordenadas
printf("Digite a coordenada x superior esq.: ");
scanf("%d", &quadro.esqcima.x);
......@@ -29,11 +29,11 @@ void main() {
printf("digite a coordenada y inferior dir.: ");
scanf("%d", &quadro.dirbaixo.y);
/* calcula o comprimento e a largura */
// calcula o comprimento e a largura
largura = quadro.dirbaixo.x - quadro.esqcima.x;
altura = quadro.esqcima.y - quadro.dirbaixo.y;
/* calcula e informa a area */
// calcula e informa a area
area = abs(largura * altura);
printf("O retangulo tem uma area de %ld unidades.\n", area);
//O exemplo da apostila daria numero negativo
......
/* Passando argumentos por valor e referencia */
// Passando argumentos por valor e referencia
#include <stdio.h>
struct coord {
......@@ -17,11 +17,11 @@ void main () {
printf("Antes de chamar por_valor(): x = %d, y = %d\n", ponto.x, ponto.y);
por_valor(ponto); /* chamada por valor */
por_valor(ponto); // chamada por valor
printf("Depois de chamar por_valor(): x = %d, y = %d\n", ponto.x, ponto.y);
por_ref(&ponto); /* chamada por referencia */
por_ref(&ponto); // chamada por referencia
printf("Depois de chamar por_ref(): x = %d, y = %d\n", ponto.x, ponto.y);
}
......
......@@ -4,7 +4,7 @@
void main() {
char vogal;
printf("Digite uma vogal: ");
scanf("%c", &vogal); /* le uma letra */
scanf("%c", &vogal); // le uma letra
switch (vogal) {
case 'a': vogal='e'; break;
case 'e': vogal='i'; break;
......
......@@ -9,7 +9,7 @@ int prox_par(void) {
void main(void) {
int i;
printf ("Os numeros pares menores que 100 sao: "); //Se seguir apostila tem que ser 200
for(i = 0; i < 50; i++) { //Apostila i < 100
for(i = 0; i < 50; i++) { // Apostila i < 100
printf ("%d ", prox_par());
}
printf ("\n");
......
struct pessoa {
char nome[30];
int sexo: 1; /* 0-> feminino, 1->masculino */
int sexo: 1; // 0-> feminino, 1->masculino
int idade: 7;
int estado_civil: 2;
/* 0-> solteiro
1-> casado
2-> desquitado
3->viuvo */
// 0-> solteiro
// 1-> casado
// 2-> desquitado
// 3-> viuvo
} pessoas[2];
int main () {
pessoas[0].nome = "Jose Maria da Silva"; //Verificar!!!!
pessoas[0].sexo = 1; /* masculino */
strcpy(pessoas[0].nome, "Jose Maria da Silva"); //Verificar!!!!
pessoas[0].sexo = 1; // masculino
pessoas[0].idade = 34;
pessoas[0].estado_civil = 0; /* solteiro */
pessoas[0].estado_civil = 0; // solteiro
}
......@@ -7,4 +7,4 @@ apostila.pdf: *.tex exemplos/*.c
clean:
rm -f *.toc *.aux *.log *.dvi
rm -f *.toc *.aux *.log *.dvi *.backup
......@@ -33,7 +33,7 @@ O operador de atribuição também pode ser usado de forma encadeada:
\begin{lstlisting}
bananas = tomate = laranja = 50;
/* atribui o valor 50 a todas estas variaveis */
// atribui o valor 50 a todas estas variaveis
\end{lstlisting}
\subsection{Operadores Matemáticos}
......@@ -57,8 +57,8 @@ Decrementa o operando em uma unidade & \verb|--x|, \verb|x--| \\
Exemplos:
\begin{lstlisting}
++x; /* equivalente a x = x + 1 */
y--; /* equivalente a y = y - 1 */
++x; // equivalente a x = x + 1
y--; // equivalente a y = y - 1
\end{lstlisting}
......@@ -102,9 +102,9 @@ void main()
{
int a,b;
a = b = 3; /* atribui o valor 3 a "a"e "b"*/
/* Imprime ambas as variaveis e as decrementa usando*/
/* o modo de prefixo para b e de sufixo para a */
a = b = 3; // atribui o valor 3 a "a"e "b"
// Imprime ambas as variaveis e as decrementa usando
// o modo de prefixo para b e de sufixo para a
printf("n%d %d\n",a--,--b);
printf("n%d %d\n",a--,--b);
......@@ -187,12 +187,12 @@ Se você escrever será equivalente a
\begin{table}
\centering
\begin{tabular}{|c|c|}
\hline x += y & x = x + y \\
\hline x -= y + 1 & x = x - (y + 1) \\
\hline x *= y & x = x * y \\
\hline x /= y - 3 & x = x / (y - 3) \\
\hline x $\%$= y & x = x $\%$ y \\
\begin{tabular}{|rl|rl|}
\hline x &+= y & x &= x + y \\
\hline x &-= y + 1 & x &= x - (y + 1) \\
\hline x &*= y & x &= x * y \\
\hline x &/= y - 3 & x &= x / (y - 3) \\
\hline x &$\%$= y & x &= x $\%$ y \\
\hline
\end{tabular}
\caption{Operadores de atribuição compostos}
......@@ -211,10 +211,10 @@ tabela \ref{tab:op-rel}.
\begin{tabular}{|l|l|l|l|}
\hline Operador & Símbolo & Pergunta Respondida & Exemplo \\
\hline Igual & == & Operando 1 é igual ao operando 2? & x == y \\
\hline Maior que & > & Operando 1 é maior que o operando 2? & x ? y \\
\hline Menor que & < & Operando 1 é menor que o operando 2? & x ! y \\
\hline Maior ou igual a & >= & Operando 1 é maior ou igual ao operando 2? & x ?= y \\
\hline Menor ou igual a & <= & Operando 1 é menor ou igual ao operando 2? & x != y \\
\hline Maior que & > & Operando 1 é maior que o operando 2? & x > y \\
\hline Menor que & < & Operando 1 é menor que o operando 2? & x < y \\
\hline Maior ou igual a & >= & Operando 1 é maior ou igual ao operando 2? & x >= y \\
\hline Menor ou igual a & <= & Operando 1 é menor ou igual ao operando 2? & x <= y \\
\hline Diferente & != & Operando 1 é diferente do operando 2? & x != y \\
\hline
\end{tabular}
......@@ -263,7 +263,7 @@ Exemplo:
\begin{lstlisting}
z = (x ? y) ? x : y;
/* Se x for maior que y, z=x, caso contrario, z=y */
// Se x for maior que y, z=x, caso contrario, z=y
\end{lstlisting}
Assim como na matemática, existe diferença na precedência dos operadores em C.
......
\documentclass[apostila.tex]{subfiles}
\begin{document}
\chapter{Operadores de bit}
......@@ -14,15 +16,15 @@ Entende-se por operações lógicas AND, OR, NOT, XOR e SHIFT's.
Exemplo:
Tome os números $5$ e $14$. Em binário:
\begin{align}
5 &= 0101 \\
14 &= 1110
5 &= 0101 \notag\\
14 &= 1110 \notag
\end{align}
Uma operação AND bit-a-bit entre 5 e 14:
\begin{align}
&0101
&1110
&0100
0101& \notag\\
1110& \notag\\
0100& \notag\\
\end{align}
Ou seja, 5 AND 14 = 4
......@@ -57,22 +59,28 @@ entre a base 2 e a base 16 é bastante fácil e direta.
Na linguagem C, para especificar que uma determinada constante numérica está na base hexadecimal,
basta iniciar a representação do número com 0x (zero x).
exemplo:
Exemplo:
0 \verb\&\ 0 = 0 Ex: Dec. Hex. Binário
0 \verb\&\ 1 = 0 31503 0x7b0f 0111 1011 0000 1111
1 \verb\&\ 0 = 0 \verb\&\ 16277 0x3f95 0011 1111 1001 0101
1 \verb\&\ 1 = 1 15109 0x3b05 0011 1011 0000 0101
\begin{table}
\centering
\begin{tabular}{lrl|l|l}
0 \verb\&\ 0 = 0 & Ex: & Dec. & Hex. & Binário \\
0 \verb\&\ 1 = 0 & & 31503 & 0x7b0f & 0111 1011 0000 1111 \\
1 \verb\&\ 0 = 0 & \verb|&| & 16277 & 0x3f95 & 0011 1111 1001 0101 \\
1 \verb\&\ 1 = 1 & & 15109 & 0x3b05 & 0011 1011 0000 0101 \\
\end{tabular}
\end{table}
Figura 12.1:
int z=0xff; ( atribui a constante (ff)16 ao z.
\begin{lstlisting}
int z=0xff; // atribui a constante (ff)16 ao z.
\end{lstlisting}
\section{Operações bit-a-bit em C}
\begin{table}
\centering
\begin{tabular}{|l|l|l|}
\begin{tabular}{|p{.13\textwidth}|p{.13\textwidth}|p{.74\textwidth}|}
\hline Operador & Nome & Descrição \\
\hline \verb|&| & AND & E binário \\
\hline \verb\|\ & OR & OU binário \\
......@@ -115,7 +123,9 @@ programa.
Se deve ser escrito um algoritmo para detectar se a opção associada ao 3º
bit está ativada, pode ser utilizado um AND de bits da seguinte forma:
VAR A \verb\&\ 4 ) 4 em binário é (100)2
\begin{lstlisting}
A & 4 // 4 em binário é (100)2
\end{lstlisting}
O resultado desta operação só será diferente de zero se o 3º bit estiver ativado.
......@@ -127,54 +137,65 @@ de ambos os bits serem 0, o resultado será 0.
O operador \verb\|\ pode ser utilizado para ligar (setar) bits em números.
0 j 0 = 0 Ex: Dec. Hex. Binário
0 j 1 = 1 31503 0x7b0f 0111 1011 0000 1111
1 j 0 = 1 j 16277 0x3f95 0011 1111 1001 0101
1 j 1 = 1 32671 0x7f9f 0111 1111 1001 1111
Tabela 12.2: Regras para o operador j
\begin{table}
\centering
\begin{tabular}{lrl|l|l}
0 | 0 = 0 & Ex: & Dec. & Hex. & Binário \\
0 | 1 = 1 & & 31503 & 0x7b0f & 0111 1011 0000 1111 \\
1 | 0 = 1 & | & 16277 & 0x3f95 & 0011 1111 1001 0101 \\
1 | 1 = 1 & & 32671 & 0x7f9f & 0111 1111 1001 1111 \\
\end{tabular}
\caption{Regras para o operador |}
\end{table}
Considerando novamente o exemplo da variável VAR A que determina a configuração de um programa,
suponha que seja necessário ativar o 3º bit. Para tanto, a seguinte operação pode ativar o 3º bit:
VAR A j 4 ) 4 em binário é 100
\begin{lstlisting}
A | 4 // 4 em binário é 100
\end{lstlisting}
Ou seja, como pelo menos o 3º bit da constante 4 é 1, isso significa que o resultado da operação
terá o 3º bit com o valor 1.
\section{Operador \^ (XOR)}
\section{Operador \^\ (XOR)}
O operador \verb\^\ executa uma operação OU EXCLUSIVO (XOR) entre cada um dos bits dos operandos.
Genericamente, dados n operandos, o resultado de uma operação XOR entre os n operandos será 1 se, e
somente se, o número de operandos que assumem valor 1 é impar.
0 \^ 0 = 0 Ex: Dec. Hex. Binário
0 \^ 1 = 1 31503 0x7b0f 0111 1011 0000 1111
1 \^ 0 = 1 \^ 16277 0x3f95 0011 1111 1001 0101
1 \^ 1 = 0 17562 0x449a 0100 0100 1001 1010
Tabela 12.3: Regras para o operador \verb|^|
\begin{table}
\centering
\begin{tabular}{||l||rlll}
0 \verb\^\ 0 = 0 & Ex: & Dec. & Hex. & Binário \\
0 \verb\^\ 1 = 1 & & 31503 & 0x7b0f & 0111 1011 0000 1111 \\
1 \verb\^\ 0 = 1 & \verb\^\ & 16277 & 0x3f95 & 0011 1111 1001 0101 \\
1 \verb\^\ 1 = 0 & & 17562 & 0x449a & 0100 0100 1001 1010 \\
\end{tabular}
\caption{Regras para o operador $\hat{}$ }
\end{table}
Na esquerda do quadro é exibida tabela--verdade que define a operação e à direita um exemplo mostrado
Na esquerda do quadro é exibida a tabela verdade que define a operação e à direita um exemplo mostrado
nas três bases mais usadas.
A operação XOR possui uma propriedade interessante: se uma máscara é aplicada duas vezes ao
mesmo número, o resultado é o número original. De uma forma genérica, podemos dizer que $( A ^ B ) ^
B = A$.
mesmo número, o resultado é o número original. De uma forma genérica, podemos dizer que $(A\hat\ B)\hat\ B = A$.
A tabela ?? demonstra esta propriedade.
A tabela \ref{tab:xor_transi} demonstra esta propriedade.
Dec. Hex. Binário
31503 0x7b0f 0111 1011 0000 1111
\^ 16277 0x3f95 0011 1111 1001 0101
17562 0x449a 0100 0100 1001 1010
17562 0x449a 0100 0100 1001 1010
\^ 16277 0x3f95 0011 1111 1001 0101
31503 0x7b0f 0111 1011 0000 1111
Tabela 12.4: Propriedade especial do XOR
\begin{table}
\centering
\begin{tabular}{rl|l|l}
& Dec. & Hex. & Binário \\ \hline
& 31503 & 0x7b0f & 0111 1011 0000 1111 \\
$\hat{}$ & 16277 & 0x3f95 & 0011 1111 1001 0101 \\ \cline{2-4}
& 17562 & 0x449a & 0100 0100 1001 1010 \\ \cline{2-4}\cline{2-4}
& 17562 & 0x449a & 0100 0100 1001 1010 \\
$\hat{}$ & 16277 & 0x3f95 & 0011 1111 1001 0101 \\\cline{2-4}
& 31503 & 0x7b0f & 0111 1011 0000 1111 \\
\end{tabular}
\caption{Propriedade especial do XOR}\label{tab:xor_transi}
\end{table}
Esta propriedade torna a operação XOR bastante usada em criptografia. Aplica-se uma máscara sobre
um documento através de um XOR e obtém-se o documento ``disfarçado''. Reaplicando-se a máscara,
......@@ -195,10 +216,10 @@ A forma geral de uso desses operadores é:
Observe o exemplo abaixo:
\begin{lstlisting}
/* ... */
unsigned int x = 0xC743; /* x = 1100 0111 0100 0011 */
x = x !! 3; /* x = 0011 1010 0001 1000 */
/* ... */