【求助】二进制计算

baolv8746 2016-12-08 09:13:43
一个十六进制数:D2 A3

1.要转换成二进制

2.二进制取反

3.取反后末尾加1.

4.判断是否为负数,如把D2(十进制为210)转换为十进制,然后判断 if( 210 >127 ) 大于为正数,反之为负数

是不是二进制数存入到char数据中,然后一位一位比较,是这样处理吗?
...全文
265 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿源是少年 2016-12-09
  • 打赏
  • 举报
回复
上述有笔误,是16位存放与32位存放
baolv8746 2016-12-08
  • 打赏
  • 举报
回复
引用 3 楼 xianglitian 的回复:
不管是什么进制,数还是那个数,方法也还是那些方法 D2如果是以字符串的形式获取到的 那就直接转换成int进行相关操作即可
是字符形式的 cstring,十六进制直接转2进制,然后进行取反,然后取反加1进行计算吧
向立天 2016-12-08
  • 打赏
  • 举报
回复
不管是什么进制,数还是那个数,方法也还是那些方法 D2如果是以字符串的形式获取到的 那就直接转换成int进行相关操作即可
赵4老师 2016-12-08
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
int main() {
    int i,v;
    char bs[33];
    char b[33];
    char hs[9];
    char h[9];
    char s[4];
    char *e;

// 十进制整数转二进制串;
    i=1024;
    ltoa(i,b,2);
    sprintf(bs,"%032s",b);
    printf("i=%d,bs=%s\n",i,bs);
// 十进制整数转十六进制串;
    i=1024;
    ltoa(i,h,16);
    sprintf(hs,"%08s",h);
    printf("i=%d,hs=%s\n",i,hs);
// 十六进制字符串转成十进制数
    strcpy(hs,"00000400");
    sscanf(hs,"%x",&i);
    printf("hs=%s,i=%d\n",hs,i);
// 二进制字符串转化为十六进制字符串;
    strcpy(bs,"00000000000000000000010000000000");
    i=strtol(bs,&e,2);
    ltoa(i,h,16);
    sprintf(hs,"%08s",h);
    printf("bs=%s,hs=%s\n",bs,hs);
// 二进制字符串转化为十进制数;
    strcpy(bs,"00000000000000000000010000000000");
    i=strtol(bs,&e,2);
    printf("bs=%s,i=%d\n",bs,i);
// 十六进制字符串转成二进制串
    strcpy(hs,"00000400");
    sscanf(hs,"%x",&i);
    ltoa(i,b,2);
    sprintf(bs,"%032s",b);
    printf("hs=%s,bs=%s\n",hs,bs);
// ASC\GBK字符串转十六进制串
    strcpy(s,"a汉");
    i=0;
    while (1) {
        if (0==s[i]) break;
        sprintf(hs+i*2,"%02X",(unsigned char)s[i]);
        i++;
    }
    setlocale(LC_ALL,"chs");
    printf("s=%s,hs=%s\n",s,hs);
// 十六进制字符串转成汉字(GBK)及字符(ASC)
    strcpy(hs,"61BABA");
    i=0;
    while (1) {
        if (1!=sscanf(hs+i*2,"%2x",&v)) break;
        s[i]=(char)v;
        i++;
    }
    s[i]=0;
    printf("hs=%s,s=%s\n",hs,s);

    return 0;

}
//i=1024,bs=00000000000000000000010000000000
//i=1024,hs=00000400
//hs=00000400,i=1024
//bs=00000000000000000000010000000000,hs=00000400
//bs=00000000000000000000010000000000,i=1024
//hs=00000400,bs=00000000000000000000010000000000
//s=a汉,hs=61BABA
//hs=61BABA,s=a汉
lx624909677 2016-12-08
  • 打赏
  • 举报
回复
二进制数要转成十进制数,得要去读二进制数的每一位
阿源是少年 2016-12-08
  • 打赏
  • 举报
回复
1.计算机中存放数字用的是补码,负数的补码转原码才会取反加1,正数的补码等于原码 2.16进制的好处在于可以还原二进制位的情况,每个16进制位与4个二进制位一一对应 3.给你一个16进制数,你要判断是正数还是负数,你必须要知道这个数原本是多少位的,关键的来了: D2A3对应的二进制位是32位:
‭1101001010100011‬
如果用32位int去存放它,那么最高位是1,表示他是负数,如果用64位的longlong去存放它,那么他是正数,因为最高位是0,所以你要根据一个字符串的16进制去转数字,你先要知道这个数是多少位的,比如你要转int 32那么可以这么做:
#include "stdafx.h"
#include "string.h"

int HexToInt32(const char* s)
{
	int nRet = 0;
	int nLen = strlen(s);
	for(int x = 0; x < nLen; ++x)
	{
		int p = s[x];
		switch(p)
		{
		case '0': p = 0x0; break;
		case '1': p = 0x1; break;
		case '2': p = 0x2; break;
		case '3': p = 0x3; break;
		case '4': p = 0x4; break;
		case '5': p = 0x5; break;
		case '6': p = 0x6; break;
		case '7': p = 0x7; break;
		case '8': p = 0x8; break;
		case '9': p = 0x9; break;
		case 'A': p = 0xA; break;
		case 'B': p = 0xB; break;
		case 'C': p = 0xC; break;
		case 'D': p = 0xD; break;
		case 'E': p = 0xE; break;
		case 'F': p = 0xF; break;
		}
		int nShift = (nLen - 1 - x) * 4;
		nRet |= p << nShift;
	}
	return nRet;
}


int _tmain(int argc, _TCHAR* argv[])
{
	const char* strHex = "D2";
	int n = HexToInt32(strHex);
	printf("Hex:%s --> Dec:%d", strHex, n);
	getchar();
	return 0;
}
没用C的直接转换函数是为了展示整个转换过程,HexToInt32()这个函数要求16进制字符串必须为大写,你需要小写的判断可以再switch里面加

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧