C Language_Operator Combat real_vários usos de operadores para resolver problemas (Explicação)

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;
}

Insira a descrição da imagem aqui
(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;
}

Insira a descrição da imagem aqui
Aqui está um exemplo com a = -1, b = 4

Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
Obter troca

2. Encontre o número de dígitos 1 em binário

Fonte da pergunta

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;
}

Insira a descrição da imagem aqui

Mas há uma falha aqui, os dígitos binários de números negativos não podem ser calculados

Insira a descrição da imagem aqui
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;
}

Insira a descrição da imagem aqui

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;
}

Insira a descrição da imagem aqui
Insira a descrição da imagem aqui

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

Fonte da pergunta

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;
}

Insira a descrição da imagem aqui

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;
}

Insira a descrição da imagem aqui
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

Insira a descrição da imagem aqui
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);

}

Insira a descrição da imagem aqui
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

Acho que você gosta

Origin blog.csdn.net/dodamce/article/details/113243797
Recomendado
Clasificación