原码 反码 补码 数字 用 二进制表示 6数据 110真值 在电脑中字节是基本单位 8位 6->00000110 原码 正整数中,原码,反码,补码相同 负数中 -6 -> -00000110 通常将第一位用作符号位,0为正数,1为负数 -6 -> 10000110 原码 负数的反码:负数的原码符号位不变,其他位取反 10000110 -> 11111001 负数的补码: 方案1:负数的反码+1 11111001 1 11111010 方案2:负数的原码两端1不变,中间取反 10000110 1 1 11110 11111010 位运算(二进制计算) 6&1=0 与& 或| 非~ 异或^ 左移<< 右移>> &指两边同位的数字均为1,结果才是1 9&2=0 7&1=1 通常n&1可以用来判断奇偶数 |两边同位的数字存在1,结果就是1 6|1=7 9|2=11 7|1=7 ~取反 ^两边同位数字相同为0不同为1 100^61= 89 1100100 0111101 1011001 64+16+8+1 = 89 <<原数据*2 6<<1=12 00000[110] 0000[110]0 -> 12 >>原数据/2 取整 6>>1=3 3>>1=1 00000[110] 000000[11] 0000000[1] 如果是负数,符号位不动 二分法 (l+r)/2 -> l+r>>1 不需要加括号,位运算符号优先级低 进制转换: 出题方式1:n转10 10转n n转m [64进制以内] 出题方式2:带小数的 10进制->2进制 87.355(10)->??(2) 整数:87/2 短除法 (倒序) 小数:0.355*2 取整 按顺序(不需要倒序) 0.355*2=0.71 0 0.71*2=1.42 1 0.42*2=0.84 0 0.84*2=1.68 1 0.68*2=1.36 1 0.36*...直到小数部分消失,无法消掉就是无限长 1010111.01011.... 2进制->10进制 0.01011 0/2 1/2/2 0/2/2/2 1/2/2/2/2 1/2/2/2/2/2 累加:0.25+0.0625+0.03125=0.34375 string s="1223"; stoi(s);//对 stoi("1223");//错 "1223" 默认是char* stoi('1');//错 '1' 是char atoi("1223");//对 数字->字符 int k=5; char(k+'0') #include <bits/stdc++.h> using namespace std; //制作进制表 string tton="0123456789abcdefghijklmnopqrstuvwxyz"; char ntot[128]; void init(){ for(int i=48;i<58;i++) ntot[i]=i-48; for(int i=97;i<123;i++) ntot[i]=i-97+10; } //10进制转n进制 string tenton(int num,int n){ string ans=""; while(num){ ans=tton[num%n]+ans; num/=n; } return ans; } //n进制转10进制 int ntoten(string num,int n){ int jz=1; int ans=0; for(int i=num.size()-1;i>=0;i--){ ans+=ntot[num[i]]*jz; jz*=n; } return ans; } int main(){ init(); int n=16,m=8; string a="ff2d"; int k=ntoten(a,n); string b=tenton(k,m); cout<<k<<" "<<b; return 0; } 小猫分鱼: 3 1 假设3号猫拿1条鱼,那么原有1*3+1=4,占2号猫2份 因此2号猫拿4/2条鱼,原有2*3+1=7,占1号猫2份(无法整除,失败) 假设3号猫拿2条鱼,那么原有2*3+1=7,占2号猫2份(无法整除,失败) 假设3号猫拿3条鱼,那么原有3*3+1=10,占2号猫2份 因此2号猫拿10/2条鱼,原有5*3+1=16,占1号猫2份 因此1号猫拿16/2条鱼,原有8*3+1=25,原有25条鱼 int y=0; for(int k=1;k<n;k++){ y=k*n+i; bool f=true; //验证 for(int j=1;j<n;j++){ if(y%(n-1)!=0){ f=false; break; } y=y/(n-1)*n+1; } if(f){ cout<<y; return 0; } } 单位转换 int n; string x, s1, d, w, s2; cin>>n; while(n){ cin>>x>>s1>>d>>w>>s2; string l="000"; if(s1+s2=="kmmm" ||s1+s2=="kgmg") l="000000"; printf("%s %s = %s%s %s\n",x.c_str(),s1.c_str(),x.c_str(),l.c_str(),s2.c_str()); } return 0; (责任编辑:admin) |