Langage C : Exercices

Question 1 : célibataires

 

Seuls deux nombres apparaissent une fois dans un tableau et tous les autres nombres apparaissent deux fois.
Écrivez une fonction pour trouver les deux nombres qui n'apparaissent qu'une seule fois.
Par exemple :
les éléments du tableau sont : 1, 2, 3, 4, 5, 1, 2, 3, 4,
6, seuls 5 et 6 apparaissent une fois, pour trouver 5 et 6.

#include <stdio.h>


int* find_signal_dog(int* arr,int sz,int* signal_dog)
{
	int i = 0;
	int tmp = 0;
	for (i = 0; i < sz; i++)
	{
		tmp ^= arr[i];//得到不相同的两个数的按位异或
	}
	int pos = 0;
	for (i = 0; i < 32; i++)
	{
		//得出向右移动多少位按位与结果为一
		if (((tmp >> i) & 1) == 1)
		{
			pos = i;
			break;
		}
	}
	for (i = 0; i < sz; i++)
	{
		//将&为一和零的各分一组,再异或得到不同的两个数
		if (((arr[i] >> pos) & 1) == 1)
		{
			signal_dog[0] ^= arr[i];
		}
		else
		{
			signal_dog[1] ^= arr[i];
		}
	}

}



int main()
{
	int arr[] = { 1,2,3,4,5,1,2,3,4,6 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int* signal_dog[2] = { 0 };
	find_signal_dog(arr, sz, signal_dog);
	printf("%d %d\n",signal_dog[0] , signal_dog[1]);
	return 0;
}

mauvais choix multiple

Il existe les définitions de macro et les définitions de structure suivantes

Lorsque A=2, B=3, le pointeur alloue ( ) octets d'espace.

int main()
{
  unsigned char puc[4];
  struct tagPIM
  {
    unsigned char ucPim1;
    unsigned char ucData0 : 1;
    unsigned char ucData1 : 2;
    unsigned char ucData2 : 3;
  }*pstPimData;
  pstPimData = (struct tagPIM*)puc;
  memset(puc,0,4);
  pstPimData->ucPim1 = 2; 
  pstPimData->ucData0 = 3;
  pstPimData->ucData1 = 4;
  pstPimData->ucData2 = 5;
  printf("%02x %02x %02x %02x\n",puc[0], puc[1], puc[2], puc[3]);
  return 0;
}

A.20

B.15

C.11

D.9

Explication : La structure est alignée sur le caractère le plus long. Les deux premiers éléments de segment de bits ont un total de 4+2 bits, soit moins de 8 bits. Ils occupent 1 octet au total, et le dernier est de 1 octet seul, un total de 3 octets. De plus, #define effectue une recherche et un remplacement. L'instruction sizeof(struct _Record_Struct) * MAX_SIZE est en fait 3*2+3, et le résultat est 9, alors choisissez D.

Sous X86, stockage de l'ordre des octets little-endian, il existe les programmes suivants

#include<stdio.h>
int main()
{
  union
  {
    short k;
    char i[2];
  }*s, a;
  s = &a;
  s->i[0] = 0x39;
  s->i[1] = 0x38;
  printf("%x\n", a.k);
  return 0;
}

Le résultat de sortie est ( )

A.3839

B.3938

C.380039

D. pas sûr

L'union n'a que 2 octets et l'hexadécimal à 2 octets n'a que 4 bits, donc le CD de réponse est exclu. L'ordre des bits est similaire à Little Endian, l'adresse basse est en position basse, donc 39 est l'adresse basse, en position basse, et 38 est en position haute, donc c'est 3839, alors choisissez A.

 sujet classique

Le résultat du code suivant est ( )

int main()
{
  unsigned char puc[4];
  struct tagPIM
  {
    unsigned char ucPim1;
    unsigned char ucData0 : 1;
    unsigned char ucData1 : 2;
    unsigned char ucData2 : 3;
  }*pstPimData;
  pstPimData = (struct tagPIM*)puc;
  memset(puc,0,4);
  pstPimData->ucPim1 = 2; 
  pstPimData->ucData0 = 3;
  pstPimData->ucData1 = 4;
  pstPimData->ucData2 = 5;
  printf("%02x %02x %02x %02x\n",puc[0], puc[1], puc[2], puc[3]);
  return 0;
}

B.02 29 00 00

C.02 25 00 00

D.02 29 04 00

puc est un tableau de caractères, qui saute un octet à la fois, mais la structure ne l'est pas, il n'a que le premier élément à partager un seul octet, et les trois autres éléments partagent un octet ensemble, donc après que puc soit rempli par la structure , il n'a que deux octets seront écrits, les deux derniers octets doivent être 0, donc AD est exclu, puis le premier octet est 2, il est 2, le deuxième octet est plus gênant, tout d'abord, ucData0 a donné 3, qui est en fait hors limites Oui, le nombre à 1 chiffre ne peut être que 0 ou 1, donc 11 n'est que 1 après troncature. De même, le 4 donné par ucData1 est également hors limites. Une fois 100 tronqué, c'est 00, et seulement 5 sur 101 sont normaux. La séquence de remplissage est similaire à l'adresse basse du petit boutiste, donc la séquence d'arrangement est 00 101 00 1. C'est 0010 1001, qui est 0x29, alors choisissez B.

Je suppose que tu aimes

Origine blog.csdn.net/weixin_71964780/article/details/132130443
conseillé
Classement