源码反码部码
源码变补码
1001
-1的源码
1110
取反
1111
加1得到-1的补码
补码变源码
1111
-1的补码
0000
取反
0001
加1
1001
处理符号位 与1000...相或位运算 得到-1的源码
#define _CRT_SECURE_NO_WARNINGS
#include
#include
char stry[33] = { 0 }; //int站32位,最后一个放\0 需要32个空间
char strf[33] = { 0 };
char strb[33] = { 0 };
//100010010 内存中的码
//100000000 与这个相&
//100000000 判断第一位是否为0 是否为补码
//100010010 左边移动一位,求出第二个数 num=num<<1 num<<=1
//
void bcode(int num)
{
unsigned int data = 1 << 31;//左边移动 变成1000 0000 0000 0000 0000 0000 0000 0000
for (int i = 1; i <= 32; i++)
{
if (num&data)
{
strb[i - 1] = '1';// 如果与第一个10000。。。。相&不为0,那么第0位也就是31位
}
else
{
strb[i - 1] = '0';
}
num <<= 1;// num=num<<1 左移动
//继续循环,总共循环32次就得到所有的编码
}
}
void fcode(int num)//求出反码, 复用上面的代码
{
unsigned int data = 1 << 31;
if (num < 0)
{
num = num - 1; //补码等于反码+1,那么反码就等于补码-1
}
for (int i = 1; i <= 32; i++)
{
if (num&data)
{
strf[i - 1] = '1';
}
else
{
strf[i - 1] = '0';
}
num <<= 1;
}
}
void ycode(int num)//求源码复用上面代码
{
unsigned int data = 1 << 31;
if (num < 0)
{
num = ~num + 1;// 补码= 源码取反+1,补码的补码就是源码
num=num | data; //处理符号位,让符号位变成1 与100...或 任何数与1相或都等于1
}
for (int i = 1; i <= 32; i++)
{
if (num&data)
{
stry[i - 1] = '1';
}
else
{
stry[i - 1] = '0';
}
num <<= 1;
}
}
void main()
{
int num;
scanf("%d", &num);
bcode(num);
printf("%s", strb);
fcode(num);
printf("\n%s", strf);
ycode(num);
printf("\n%s", stry);
system("pause");
}
给外部文件调,要封装起来,全局变量变为变局部变量
void fcode(int num, char strf[33]) 定义为两个参数的函数
main()函数里面定义三个数组 strf strb stry
调用的时候 bcode(num,strb);
#define _CRT_SECURE_NO_WARNINGS
#include
#include
//char stry[33] = { 0 }; //int站32位,最后一个放\0 需要32个空间
//char strf[33] = { 0 };
//char strb[33] = { 0 };
//100010010 内存中的码
//100000000 与这个相&
//100000000 判断第一位是否为0 是否为补码
//100010010 左边移动一位,求出第二个数 num=num<<1 num<<=1
//
void bcode(int num,char strb[33])
{
unsigned int data = 1 << 31;//左边移动 变成1000 0000 0000 0000 0000 0000 0000 0000
for (int i = 1; i <= 32; i++)
{
if (num&data)
{
strb[i - 1] = '1';// 如果与第一个10000。。。。相&不为0,那么第0位也就是31位
}
else
{
strb[i - 1] = '0';
}
num <<= 1;// num=num<<1 左移动
//继续循环,总共循环32次就得到所有的编码
}
}
void fcode(int num, char strf[33])//求出反码, 复用上面的代码
{
unsigned int data = 1 << 31;
if (num < 0)
{
num = num - 1; //补码等于反码+1,那么反码就等于补码-1
}
for (int i = 1; i <= 32; i++)
{
if (num&data)
{
strf[i - 1] = '1';
}
else
{
strf[i - 1] = '0';
}
num <<= 1;
}
}
void ycode(int num, char stry[33])//求源码复用上面代码
{
unsigned int data = 1 << 31;
if (num < 0)
{
num = ~num + 1;
num=num | data; //处理符号位,让符号位变成1 与100...或 任何数与1相或都等于1
}
for (int i = 1; i <= 32; i++)
{
if (num&data)
{
stry[i - 1] = '1';
}
else
{
stry[i - 1] = '0';
}
num <<= 1;
}
}
void main()
{
int num;
char strb[33] = { 0 };
char strf[33] = { 0 };
char stry[33] = { 0 };
scanf("%d", &num);
bcode(num,strb);
printf("%s", strb);
fcode(num,strf);
printf("\n%s", strf);
ycode(num,stry);
printf("\n%s", stry);
system("pause");
}
封装好之后,就可以做移植了,移植到mfc或者QT
MFC界面编程请参考MFC封装
\\需要的控件,变量绑定参见上面的文章,这里不再赘述
\\Pushbtn的触发代码如下
char strb[33] = { 0 };
char strf[33] = { 0 };
char stry[33] = { 0 };
//scanf("%d", &num);
int num=0;
CStringA str; //如果是vc++6.0 这里应该是CString
m_edit1.GetWindowTextA(str);//获取第一个输入栏的文本
sscanf(str, "%d", &num); //按%的整数 扫描到num
bcode(num, strb);
m_edit4.SetWindowTextA(strb);
//printf("%s", strb);
fcode(num, strf);
m_edit3.SetWindowTextA(strf);
//printf("\n%s", strf);
ycode(num, stry);
m_edit2.SetWindowTextA(stry);
//printf("\n%s", stry);
001.png
下面我们简单介绍一下qt里面的界面设计过程
widget.h代码如下,以下代码如果没有注释,均为qt creator软件自动生成
#ifndef WIDGET_H
#define WIDGET_H
#include // QT的交互文本输入的库文件
#include
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
// 接受QTextEdit中的输入信息,转换为补码并显示在新的QTextEdit控件中
void bcode(); // 输出补码
void fcode();//输出反码
void ycode();//输出源码
QTextEdit *input;// 输入控件,变量类型为QString
QTextEdit *bout;// 补码输出控件
QTextEdit *fout;//反码输出控件
QTextEdit *yout;//源码输出控件
QString b;//补码输出控件中接受的QString类型变量b
QString f;//补码输出控件中接受的QString类型变量f
QString y;//补码输出控件中接受的QString类型变量y
};
#endif // WIDGET_H
定义好头文件,声明好变量之后,我们就进入widget.cpp文件进行编辑
以下没有注释的内容,均为自动生成, 同类型的作用省略文字部分,只显示//表示一个注释行为
#include "widget.h"
#include "ui_widget.h"
#include//QPushButton是一个按钮控件,有触发功能
#include//QText文本交互控件
#include//QLable是一个显示控件
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
this->resize(1005,400);//调整窗口大小
QLabel *p1=new QLabel("请输入",this);//new一个QLable对象,用于用户提示,this表示显示在当前QWidget窗口中
QLabel *p2=new QLabel("补码",this);//……
QLabel *p3=new QLabel("反码",this);//……
QLabel *p4=new QLabel("源码",this);//……
QPushButton *jisuanBtn=new QPushButton("变换",this);//new一个QPusbButton,用于触发进行计算,显示的函数
this->input=new QTextEdit(this);//input为头文件中定义的,所以这里new对象的格式有所变化,在this中就能找到声明过的这个QTextEdit对象,现在将他实例化
input->resize(250,50);//调整QTextEdit空间(input)大小
p1->move(100,180);//移动交互文本的label显示位置
input->move(0,200);//移动QTextEdit空间(input)的位置
this->bout=new QTextEdit(this);//new一个bout的QTextedit
bout->resize(250,50);//……
p2->move(350,180);//……
bout->move(250,200);//……
this->fout=new QTextEdit(this);//……
p3->move(600,180);//……
fout->resize(250,50);//……
fout->move(500,200);//……
this->yout=new QTextEdit(this);//……
yout->resize(250,50);//……
p4->move(850,180);//……
yout->move(750,200);//…… 以上都为界面调整过程。其实以上过程都可以在ui里面拖动实现,只是这里纯代码的方式实现
connect(jisuanBtn,&QPushButton::clicked,this,[=](){Widget::bcode();
Widget::fcode();
Widget::ycode();});//connect函数,连接信号与槽功能
//connect函数有四个参数,分别为,信号来源控件的指针,信号的方法,实现的槽函数的指针,和实现的槽函数
//[](){}这是一个lambda表达式,我们默认[]中的参数是"="
//花括弧里面,放入需要调用的槽函数,就是实现了一个信号连接多个槽函数的功能
//信号与槽的连接有很多方式,这里只是lambda表达式的一个版本
}
Widget::~Widget()
{
delete ui;
}
void Widget::bcode()//接受文本,显示补码的函数,Widget::意思是bcode这函数是Widget类中
//这是一个C++特有
{
int num;//接受需要转换的变量
char strb[33];//用于保存补码的char *数组
QString t=this->input->toPlainText();//将input控件中的QString变量类型转换为 纯文本
num=t.toInt();//然后将这个纯文本转换为整数传递给num
unsigned int data = 1 << 31;//左边移动 变成1000 0000 0000 0000 0000 0000 0000 0000
for (int i = 1; i <= 32; i++)
{
if (num&data)
{
strb[i - 1] = '1';// 如果与第一个10000。。。。相&不为0,那么第0位也就是31位
}
else
{
strb[i - 1] = '0';
}
num <<= 1;// num=num<<1 左移动
//继续循环,总共循环32次就得到所有的编码
}//上面就是逻辑实现部分,这里直接复制粘贴
b=QString(QLatin1String(strb));//char *转QString才能输出,b用来接收strb[33]数组的值
this->bout->setText(b);//有了QString类型的变量 b,就可以让b显示在bout这个QTextEdit空间中
//显示格式就是this指针下的bout控件下的setText()方法, 这个方法接收一个QString类型变量
}
void Widget::fcode()//下面的代码纯粹是上面三个函数的复制粘贴,替换b为f的过程
{
int num;
char strf[33];
QString t=this->input->toPlainText();
num=t.toInt();
unsigned int data = 1 << 31;
if (num < 0)
{
num = num - 1; //补码等于反码+1,那么反码就等于补码-1
}
for (int i = 1; i <= 32; i++)
{
if (num&data)
{
strf[i - 1] = '1';
}
else
{
strf[i - 1] = '0';
}
num <<= 1;
}
f=QString(QLatin1String(strf));
this->fout->setText(f);
}
void Widget::ycode()//下面的代码纯粹是上面三个函数的复制粘贴,替换b为y的过程
{
int num;
char stry[33];
QString t=this->input->toPlainText();
num=t.toInt();
unsigned int data = 1 << 31;
if (num < 0)
{
num = ~num + 1;
num=num | data; //处理符号位,让符号位变成1 与100...或 任何数与1相或都等于1
}
for (int i = 1; i <= 32; i++)
{
if (num&data)
{
stry[i - 1] = '1';
}
else
{
stry[i - 1] = '0';
}
num <<= 1;
}
y=QString(QLatin1String(stry));
this->yout->setText(y);
}
qt.png
这里我们就实现了,补码,源码反码的输出,封装函数,界面编程实现(MFC与QT),其中MFC是windows平台,QT是跨平台