修改指定位(bit)的值

#知识储备#

一:

二进制: 0b
八进制: 0
十六进制: 0x

1.二进制

例: int x = 0b1001; // x = 9

2.八进制

例:int y = 074; // x = 60

3.十六进制

例: int z = 0xa3; // x = 163;

除此之外在char类型字符的表示时也可以用 8进制数 或 16进制数,

例: char A = '\101' 这里 以\开头表述其后为八进制数 最终 '\101' == 65 == 'A'

例: char B = '\x42' 这里 以\x开头表述其后为十六进制数 最终 '\x42' == 66 == 'B'


二:
1.按位取反运算符~
  ~是一元运算符,对数据的每个二进制位取反 。例如: ~00011001=11100110

  2.按位与运算符&(联系:离散中的合取连接词)
  参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0。即:
          0&0=0,0&1=0,1&0=0,1&1=1
  例如:      00110011 (十进制为1+2+8+16=27)
        & 10101010
        = 00100010
  

  3.按位或运算符|(联系:离散中的析取连接词)
  参与运算的两个值,只要两个相应位中有一个为1,则该位的结果为1。即:
          0|0=0,0|1=1, 1|0=1, 1 |1=1
  例如:     10100001
        | 00010001
        = 10110001
  

  4.按位异或运算符^
  参与运算的两个值,如果两个相应位相同,则结果为0,否则为1。即:
         0^0=0, 1^0=1, 0^1=1, 1^1=0
  例如:     10100001^00010001=10110000
  (1)按位异或可以用来使某些特定的位翻转,如对数10100001的第2位和第3位翻转,可以将数与00000110进行按位异或运算。
          10100001^00000110=10100111 //1010 0001 ^ 0x06 = 1010 0001 ^ 6
  (2)通过按位异或运算,可以实现两个值的交换,而不必使用临时变量。例如交换两个整数a,b的值,可通过下列语句实现:
    a=10100001,b=00000110
    a=a^b;   //a=10100111
    b=b^a;   //b=10100001
    a=a^b;   //a=00000110

代码实现:(十进制的输入,二进制打印)

#include<iostream>
#include<cstdio>
using namespace std;

//自定义pow函数求下x^y
int pow (int x,int y)   
{
    int z=1;
    for (;y>0;y--)  z*=x;
    return z;
}

//十进制转二进制式表示;     算法核心公式:Decimal_count=(0/1)*2^i+(0/1)*2^(i-1)+(0/1)*2^(i-2)+.....+(0/1)*2+1/0
int transfer(int Decimal_count)     
{   
    //定义数组存放2的幂     
    int x[10];     
    int cout=1,j=0,k=1,sum=0;   
    for(x[0]=1;cout<11;cout++) x[cout]=pow(2,cout); 

    //循环实现查找组成Decimal_cout的2的幂
    for(;;)//从找到组成Decimal_cout的2的最大次幂,到最小次幂停止
    {
        for(cout=0,k=0;cout<11;cout++)  
        {
            if(Decimal_count<x[cout]) 
            {
                Decimal_count-=x[cout-1];  
                j=cout-1;
                if (cout>0) for(k=1;j>0;j--) k*=10;     
                j=cout-1;
                sum+=k;
                break;          
            }
        }   
        if (j<=0) break;
    }
    return sum;
}

void print (int x)
{
    int i,y;
    for (i=10000000,y=x;y/i==0;i/=10) cout <<"0";
    cout <<x<<endl;
}


int main()
{   
    for(;;)
    {
    //输入要修改的十进制数
    unsigned short alter_count,altered_count;
    cout<<"#修改十进制数内存上的bit值#\n\n请输入你要修改bit值的十进制数: ";
    cin>> alter_count;
    unsigned int c=transfer(alter_count);

    //二进制打印
    cout << alter_count <<"其二进制打印为:";
    print(c);

    //选择要修改的位数
    cout << "请输入你要修改的位";
    int i;
    cin >> i;
    cout << "修改后其二进制为:";

    //运用按位运算符进行操作
    unsigned short int operater=pow(2,i-1);
    //if (i==1) altered_count=alter_count-1; 
    altered_count=alter_count^operater;

    //打印修改完成后的十进制数的二进制表示
    print(transfer(altered_count));
    cout<<"修改完成,请选择下一步命令:\n1 修改另一位十进制数\n2 退出此程序\n";

    //控制程序循进行
    int x;
    cin>>x;
    if(x!=1) break;
}
    cout<<"##程序结束##\n";
    system("pause");
    return 0;
}

 

posted @ 2020-09-06 20:05  SoberJoker  阅读(3454)  评论(0)    收藏  举报