C语言int直接转二进制

楼主偶然需要用到十进制转二进制的方法,百度一下方法好像都是模拟人工计算的,但是楼主想到在内存中数据不是本来就是二进制的吗,把每一位读取出来不就好

首先写个子函数查看一个1字节的数字某位是不是1

inline bool is1(char n,int p){//一个1字节的数字n查看他第p位是不是1
  return n&(1<<(8-p-1));
}

然后由于楼主电脑上int是大端模式保存的,所以最低位在第一个字节,最高位在最后一个字节,因此

int main(){
  int a=0b00000000111111110000111111110000;
  char *p=(char*)&a;//指向a的首地址
  for(int i=0;i<8;++i){
    putchar(is1(p[3],i)?'1':'0');
  }
  for(int i=0;i<8;++i){
    putchar(is1(p[2],i)?'1':'0');
  }
  for(int i=0;i<8;++i){
    putchar(is1(p[1],i)?'1':'0');
  }
  for(int i=0;i<8;++i){
    putchar(is1(p[0],i)?'1':'0');
  }
  getchar();
	return 0;
}

测试结果正确

再优化一下,最终可以写成这样

void tobin(int a,char* str){
  char *p=(char*)&a,c=0,f=0,pos=-1;//p指向a的首地址
  for(int o=0;o<4;++o){
    for(int i=0;i<8;++i){ 
      c=p[3-o]&(1<<(7-i));
      if(!f&&!(f=c))continue;
      str[++pos]=c?'1':'0';
    }
  }
}

转载请注明出处https://blog.csdn.net/rtduq/article/details/80274601

C语言中,将整数(int)换为十六进制字符串通常会用到`itoa()`函数,这个函数在一些旧版本的C标准库中存在,但在现代C库如`<inttypes.h>`中已经不再推荐直接使用,因为它可能会有安全风险并且不是跨平台的。 更推荐的方式是手动编写换逻辑,或者使用第三方库如`htonl()`(针对网络字节序),`__builtin.htonl()`(GCC特定)等,它们可以完成这种换。如果你需要自定义换,可以借助循环和位操作来逐位提取并换十进制数字为十六进制字符。这里有一个简单的示例: ```c #include <stdio.h> #include <string.h> // 自定义十六进制字符数组 char hex_digits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; void int_to_hexadecimal(unsigned int num, char* hex_str) { // 如果num是0,直接返回"0" if (num == 0) { strcpy(hex_str, "0"); return; } // 初始化结果字符串为前缀"0x" hex_str[0] = '0'; hex_str[1] = 'x'; // 反数组并在最高位填充字符 for (size_t i = sizeof(hex_digits) - 1; num != 0; num >>= 4, --i) { hex_str[i + 2] = hex_digits[num & 0xf]; } } int main() { unsigned int decimal_num = 12345; char hex_str[9]; // 存储最大8位十六进制数 int_to_hexadecimal(decimal_num, hex_str); printf("Decimal %u in hexadecimal is %s\n", decimal_num, hex_str); return 0; } ``` 在这个例子中,`int_to_hexadecimal`函数接收一个无符号整数和一个字符指针,它会按照从高位到低位的原则,将每个四位二进制换为一位十六进制字符,并添加前缀"0x"。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值