(一)二进制中的原码、反码、补码
原码:正数的二进制数表示就是原码。
负数的原码按照绝对值大小转换成的二进制数,然后最高位补1。
反码:正数的反码和原码相同。
负数的反码和除符号位按位取反。
补码:正数的补码和原码相同。
负数的补码为反码加1。
计算机中,采用补码表示和存储。
为什么采用补码:
由于计算中的CPU只有加法器,没有减法器,所以在计算机采用原码做减法是会存在这样的问题:对于1-1=0。
看做1+(-1)=0 二进制表示 0001+1001=1001 变成了十进制的负1而不是0。采用补码运算,则补码加法成为:[X+Y]补 = [X]补 + [Y]补,补码的减法变为:[X-Y]补 = [X]补 - [Y]补 = [X]补 + [-Y]补 。(0001)补+(1001)补 = 0001 + 1111 = 0000 (最高位的进位省略),这样就顺利得到了0。
无符号数:
无符号数即为每一位都用于存放数值,寄存器的位数为机器字长,机器字长16位,无符号数范围为0-65535。
有符号数:
最高位用于表示符号,其他位用于表示数值,机器字长16位,有符号数范围为-32768~+32767。(我们人为规定1000 0000 0000 0000为-32768)
(二)位运算:与、或、异或、左移、右移
左移:m<<n,把m左移n位,左面n位被丢弃,右面补n个0
右移:m>>n,把m右移n位,右面n位被丢弃,正数左面补0,负数左面补1
除法比位运算效率低很多
2、求二进制中1的个数
int Digit(int num)
{
int count=0;
while(num)//当num不为0时
{
num=num&(num-1);//可以去掉num的最后一个1
count++;//有一个1就加加
}
return count;
}
2、一条语句判断一个整数是不是2的整数次方
return (!(num&(num-1)==0));
3、输入n和m,计算把m的二进制改变多少个位可以得到n
int Digit(int m,int n)
{
int flag=m^n;
cout<<flag<<endl;
int count=0;
while(flag)//当num不为0时
{
flag=flag&(flag-1);//可以去掉num的最后一个1
count++;//有一个1就加加
}
return count;
}
4、十进制转成七进制
class Solution
{
public:
string Base7(int num)//返回string类型
{
int i=0;
string str;//定义一个字符串
if(num==0)//如果为0就返回字符串0
{ return "0"; }
while(num>0)
{
str+=num%7+'0';//str连接对7取余后的字符串
i++;
num/=7;//除以7
}
reverse(str.begin(), str.end());//将字符串翻转
return str;
}
string convertToBase7(int num)
{
string str;
if(num>=0)
{ str=Base7(num); }//正数和负数分开处理
else
{ str="-"+Base7(-num); }//负数就在返回之前加一个负数
return str; }//返回str
};
5、判断二进制0和1是不是交替出现的
class Solution {
public:
bool hasAlternatingBits(int n)
{
int flag=n%2;//定义一个标识
n/=2;//将n除以2
while(n)//n不为0时循环
{
if(flag==n%2)//如果对2取余和上一次结果相同,就不是交替出现的
{ return false; }
flag=n%2;
n/=2;
}
return true;//循环结束就是交替出现的
}
};
6、将区间内的所有数字按位与
class Solution {
public:
int rangeBitwiseAnd(int m, int n)
{
int res=m;
if(m==n)
{ return res; }
for(res=n;res>m;)
{
res=res&(res-1);
if(res==0)
{ return 0; }
} return res;
}
};
7、十进制转十六进制
string toHex(int num)
{
if (num == 0)
{return "0";}
string hex = "0123456789abcdef";
string ans = "";
while(num && ans.size() < 8)
{
ans = hex[num & 0xf] + ans;
num >>= 4;
}
return ans;
}
![点击并拖拽以移动 wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==](https://i-blog.csdnimg.cn/blog_migrate/2a0cf7edc0cd204ba49fdbcd2a139890.png)