进制和位运算典型题目

(一)二进制中的原码、反码、补码

原码:正数的二进制数表示就是原码。

负数的原码按照绝对值大小转换成的二进制数,然后最高位补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==
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值