c语言_面试_十进制转换为二进制_数据取反(位域操作)

一、十进制转换为二进制

char * changeNumTOhex(int num, int *numCounter)
{
	char *pArry = (char *)malloc(sizeof(char));
	for (int i = 0;; i++)
	{
		pArry[i] = num % 2;
		num = num / 2;
		if (num != 0)
		{
			pArry = (char*)realloc(pArry, i + 2);
		}
		else
		{
			*numCounter = i + 1;
			break;
		}
	}
	char *pArr = (char *)malloc((*numCounter)*sizeof(char));
	for (int i = 0; i < (*numCounter); i++)
	{
		pArr[i] = pArry[(*numCounter) - 1 - i];
	}
	free(pArry);
	return pArr;
}

void displayNum(char *pArry, int numCounter)
{
	for (int i = 0; i < numCounter; i++)
	{
		printf("%d", pArry[i]);

	}
	printf("\n");
}

二、数据取反(位域操作)

typedef union
{
	char uint8Num;
	struct
	{
		int bit0 : 1;
		int bit1 : 1;
		int bit2 : 1;
		int bit3 : 1;
		int bit4 : 1;
		int bit5 : 1;
		int bit6 : 1;
		int bit7 : 1;
	}u8Bit;
}u8Num;

char changeBit(char num)
{
	u8Num tNum;
	tNum.uint8Num = num;
	tNum.u8Bit.bit0 = ~tNum.u8Bit.bit0;
	tNum.u8Bit.bit1 = ~tNum.u8Bit.bit1;
	tNum.u8Bit.bit2 = ~tNum.u8Bit.bit2;
	tNum.u8Bit.bit3 = ~tNum.u8Bit.bit3;
	tNum.u8Bit.bit4 = ~tNum.u8Bit.bit4;
	tNum.u8Bit.bit5 = ~tNum.u8Bit.bit5;
	tNum.u8Bit.bit6 = ~tNum.u8Bit.bit6;
	tNum.u8Bit.bit7 = ~tNum.u8Bit.bit7;
	return tNum.uint8Num;
}

char changeBit(char num)等效于 num = ~num;

三、测试

int _tmain(int argc, _TCHAR* argv[])
{
	int snum;
	int numCount = 0;
	int *numCounter = &numCount;
	printf("please input 十进制 number:");
	scanf_s("%d",&snum);
	char *num = changeNumTOhex(snum, numCounter);
	displayNum(num, numCount);
	return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
	unsigned short num=8;
	scanf_s("%hu", &num);
	printf("%hhu\n", num);
	int numCounter=0;
	char * caNum = changeNumTOhex(num, &numCounter);
	displayNum(caNum, numCounter);
	num= changeBit(num);
	//num = ~num;
	printf("%hhu\n", 0xff&num);
	int numCounter2 = 0;
	char * caNum2 = changeNumTOhex(num, &numCounter2);
	displayNum(caNum2, numCounter2);
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值