Artigo Diretório
1. Troque dois números sem criar variáveis temporárias
Insira os valores de aeb aqui, você não pode criar uma variável temporária tmp para trocar
O primeiro:
#include<stdio.h>
int main()
{
int a, b = 0;
scanf("%d%d", &a, &b);
a = a + b;
b = a - b;//此时b=a+b-b=a
a = a - b;//此时a=a+b-a=b实现了交换a ,b的目的
printf("a=%d b=%d",a,b);
return 0;
}
(Observe que há problemas com este algoritmo, porque quando aeb são grandes, o valor de a + b pode exceder a faixa de modelagem do tipo int, e o valor de a + b será perdido)
O segundo tipo:
#include<stdio.h>
int main()
{
int a, b = 0;
scanf("%d%d", &a, &b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("a=%d b=%d",a,b);
return 0;
}
Aqui está um exemplo com a = -1, b = 4
Obter troca
2. Encontre o número de dígitos 1 em binário
Método 1:
O número% 2 obtém o dígito binário e então divide o número por 2 para encontrar o próximo dígito,
Até que o último dígito seja 0 após / 2, o loop irá parar se for falso
#include<stdio.h>
int main()
{
int count = 0;
int n = 0;
scanf("%d",&n);
while (n)
{
if (n % 2 == 1)
count++;
n = n / 2;
}
printf("二进制位中1的个数为%d",count);
return 0;
}
Mas há uma falha aqui, os dígitos binários de números negativos não podem ser calculados
O número negativo% 2 não executará a contagem ++ se o resto for -1
Método 2:
Nós conhecemos o & operador
Em binário, 1 e 0 = 0, apenas 1 e 1 = 1
1 Armazenado no computador está 000000000 ... 1
Então, vamos inserir o número binário & 1
Se você obtiver 1, significa que o último bit do bit binário é 1 e, em seguida, a variável >> 1
Para verificar se o próximo dígito binário é 0, um total de 32 vezes.
#include<stdio.h>
int main()
{
int a = 0;
scanf("%d",&a);
int count = 0;
for (int i = 0; i < 32; i++)
{
int j = 1;
if ((a & j) == 1)
{
count++;
}
a = a >> 1;
}
printf("二进制中1的个数%d",count);
return 0;
}
Neste momento, o número de bits binários negativos 1 também pode ser calculado
Método três:
Use dois dados adjacentes para operação AND bit a bit
#include<stdio.h>
int main()
{
int a = 0;
scanf("%d",&a);
int count = 0;
while (a)
{
a = a & (a - 1);
count++;
}
printf("二进制位为1的个数为%d",count);
return 0;
}
Quando a = 3
O dígito binário de a é 0 1 1
a-1 O binário é 0 1 0
-------- a & a-1 é 0 1 0 (contagem = 1)
Depois disso, o dígito binário de a é 0 1 0
------ o binário de a-1 é 0 0 1
-------------- a & a-1 é 0 0 0 ( contagem = 2)
Neste momento, a = 0 é um salto falso fora do loop
Quando há mais de um 1 em um bit binário, a & (a-1) não deve ser 0, porque o mesmo bit binário deve existir.
Quando o último bit é 1, o último bit de a & a-1 torna-se 0, atribuí-lo a a é equivalente a mover um bit.
Quando o último bit é 0, o último bit de a & a-1 é 0 e atribuí-lo a um é equivalente a descartar A
Quando há apenas um 1 no dígito binário, a & a-1 deve ser 0, e a contagem aumenta em 1 e sai do loop. A contagem final é o número do binário 1 em um
3. Encontre o número de números diferentes em dois dígitos binários
Em primeiro lugar, sabemos que existem duas situações para dígitos binários, 0 e 1
Primeiro usamos a operação OU exclusiva para transformar os diferentes números em 1 e armazená-los na variável c
Ao calcular o número de 1s binários na variável c, o número de 1s binários não será repetido aqui.
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d%d",&a,&b);
int c = a ^ b;
int count = 0;
for (int i = 0; i < 32; i++)
{
int j = 1;
if ((c & j) == 1)
{
count++;
}
c = c >> 1;
}
printf("%d",count);
return 0;
}
4. Avaliação de expressão
Parte da avaliação da expressão é realizada na ordem de precedência e associatividade dos operadores
A prioridade mais alta é calculada primeiro. Quando a prioridade da expressão é a mesma, a direção do cálculo é baseada na associatividade, então não vou repetir aqui.
Ao mesmo tempo, às vezes os operandos da expressão podem ser transformados em outros tipos
Conversão de modelagem (conversão de tipo invisível)
por exemplo:
#include<stdio.h>
int main()
{
char a = 3;
char b = 137;
char c = a + b;
printf("%d",c);
return 0;
}
Descobrimos que isso não é o que pensamos 140,
Isso ocorre porque o tamanho do tipo char é de um byte e um inteiro tem 4 bytes
char - 8 bits,
int — 32 bits,
A promoção de inteiros é promovida de acordo com o bit de sinal.O bit de sinal é o primeiro bit do bit binário.
O operador + opera no tipo int, então o tipo char é primeiro preenchido com 32 bits
a = 0 0 0 0 0 0 1 1 (complemento, bit de sinal é 0)
a = 0000… 0 1 1 (32 bits)
b = 1 1 1 1 1 1 1 1 (complemento)
b = 0 0 0 0 0 0 1 1 1 1 1 1 1 (32 bits)
a + b = 0 0… 1 0 0 0 0 0 0 1 0 (32 bits)
c = a + b (c é um tipo de caractere e só pode armazenar 8 bits, então ocorrerá truncamento)
c = 1 0 0 0 0 0 1 0
printf ("% d") então c precisa ser plastificado e promovido
O bit de sinal de c é 1, então adicione 1 a 32 bits
c após a promoção de inteiro
1 1 1 1 1 1… 1 0 0 0 0 0 1 0 (32 bits) (código de complemento)
1 1 1 1 1 1… 1 0 0 0 0 0 0 1 (32 bits) (código de complemento)
1 0 0 0 0 0… 0 1 1 1 1 1 1 0 (32 bits) (código original)
O bit de sinal é 1 significa que é um número negativo
. O código original é -116
Se alguns números forem dígitos sem sinais, a promoção de inteiros adicionará zero.
A promoção de inteiros só ocorre quando há dígitos binários e o tamanho é menor que o inteiro
Ocorreu uma promoção inteira.
Isso não acontecerá ao converter de int para um tipo maior do que int e não será truncado
O computador não é necessariamente o único no cálculo de expressões
por exemplo:
a*b+c*d+e*f
Você pode calcular a b, c d, e * b e, em seguida, adicionar os três juntos,
Ou pegue a b + c d como um todo e calcule primeiro, depois e * f, e depois some,
Portanto, o funcionamento da expressão pode nem sempre ser único, e deve-se ter cuidado para evitar essa situação.
por exemplo:int c=(++a)+(++a)+(++a);
#include<stdio.h>
int main()
{
int a = 4;
int c = (++a) + (++a) + (++a);
printf("%d",c);
}
O cálculo aqui é calcular ++ a três vezes primeiro, a = 7 e então a soma é 21
Mas compiladores diferentes têm ordens de cálculo diferentes. Você também pode calcular ++ a duas vezes (considerando as duas primeiras expressões como um todo) e, em seguida, calcular + (++ a) após o cálculo.
A fórmula de cálculo é muito complicada, então não há necessidade de entrar nela