当前位置:   article > 正文

C++ 位运算 与 进制转换总结_c++位运算

c++位运算

1 位运算

1.1 常见位运算

  1. 与运算(&):对两个数的每一位进行与操作,只有当两个位都是 1 时,结果的相应位才是 1。
  2. 或运算(|):对两个数的每一位进行或操作,只要有一个位是 1,结果的相应位就是 1。
  3. 异或运算(^):对两个数的每一位进行异或操作,当两个位不同时,结果的相应位是 1。
  4. 取反运算(~):对一个数的每一位进行取反操作,1 变成 0,0 变成 1。
  5. 左移运算(<<):将一个数的二进制表示向左移动指定的位数,右侧用 0 填充。 左移n位,相当于原数乘上2的n次方。
  6. 右移运算(>>):将一个数的二进制表示向右移动指定的位数,左侧用原数的符号位填充。 右移n位,相当于原数除以2的n次方。

1.2 位运算的常见应用:

1. 判断数字a奇偶性

x&1;

2.获得二进制数a的第 i 位

x>>i&1;

3.修改二进制数a的第 i 位

  1. //修改为1
  2. x|(1<<i)
  3. //修改为0
  4. n=x>>i;
  5. if(n==1) x=x&~(1<<5)
  6. //取反
  7. x^(1<<i);

4.交换数a和数b的值

  1. a=a^b;
  2. b=a^b;
  3. a=a^b;

2 进制转换

  各进制数在C++中的表示方法:

  • 二进制:以0b或0B开头,后面的数字只能用0和1表示。例如:int binary = 0b00000001;
  • 八进制:一般以0开头,但在转义字符后面,可以省略数字0。例如:int oct = 01234567;char c = '\12';
  • 十进制:非数字0开头的一串数字。例如:int val = 23;
  • 十六进制:以0x或0X开头的数字。例如:char c = 0x30;

2.1 其他进制转十进制

2.1.1 自定义函数

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int ans=0,t;
  4. string str;
  5. int test01(string str,int t)
  6. {
  7. for(int i=0;i<str.size();i++)
  8. {
  9. if(str[i]>='0'&&str[i]<='9')
  10. {
  11. ans=ans+pow(t,i)*(str[i]-'0');
  12. }
  13. else ans=ans+pow(t,i)*(str[i]-'a'+10);
  14. }
  15. return ans;
  16. }
  17. int main()
  18. {
  19. cin>>str>>t;
  20. reverse(str.begin(),str.end());
  21. cout<<test01(str,t)<<endl;
  22. return 0;
  23. }

2.1.2.strtol()函数

在 C++中,strtol函数的原型为:

long int strtol(const char *str, char **endptr, int base)

其作用是将一个字符串转换为长整型long

 

参数说明:

 
  • str:要转换的字符串。
  • endptr:第一个不能转换的字符的指针。
  • base:字符串str所采用的进制,取值范围为2至36或0。
 

该函数会将参数str字符串根据参数base来转换成无符号的长整型unsigned long,并返回转换后的结果。如果没有符合的结果,则返回一个0值。参数base代表str采用的进制方式,如base值为10则采用10进制,若base值为16则采用16进制数等。

 

  在 C++ 中,strtol 函数的参数通常是 const char* 类型,而不是直接使用 string 类型。要使用 strtol 函数处理 string 类型的参数,你可以先将 string 转换为 const char*。例如,可以使用 c_str() 函数将 string 转换为 const char*,然后将其传递给 strtol

  1. string str1;
  2. char *s2;
  3. long int ans =strtol(str1.c_str(), s2, 16);

实例:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. char s1[20];
  4. char *s2;
  5. int ans;
  6. int main()
  7. {
  8. cin>>s1;
  9. ans=strtol(s1,&s2,16);
  10. cout<<ans;
  11. return 0;
  12. }

 

 

2.2 十进制转其他进制

2.2.1 自定义函数

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int a,t;
  4. string ans;
  5. string test02(int a,int t)
  6. {
  7. while(a!=0)
  8. {
  9. int temp=a%t;
  10. if(temp>=0&&temp<=9)
  11. {
  12. ans+=temp+'0';
  13. }
  14. else ans+=temp-10+'a';
  15. a/=t;
  16. }
  17. reverse(ans.begin(),ans.end());
  18. return ans;
  19. }
  20. int main()
  21. {
  22. cin>>a>>t;
  23. cout<<test02(a,t)<<endl;
  24. return 0;
  25. }

2.2.2 itoa()函数

在 C++中,itoa()函数的参数不可以是string类型。itoa()函数是用于将整型数字转换为字符串的函数,其函数原型为

char *itoa(int value, char *str, int radix)

参数说明:

  • value是要转换的整型数字。
  • str是存储转换结果的字符数组或指针。
  • radix是转换时使用的基数,可以是2(二进制)、8(八进制)、10(十进制)或16(十六进制)。

 

需要注意的是,itoa()并不是一个标准的 C++函数,它是 Windows 特有的,C++中可以使用——_itoa()形式或者使用sprintf()函数来替代。 

2.2.3 sprintf()函数

在 C++中,sprintf()函数可以将十进制数转换为八进制和十六进制数,但不支持二进制。示例如下:

%o表示转换为八进制,%x表示转换为十六进制(小写字母),%X表示转换为十六进制(大写字母)

  1. #include <iostream>
  2. #include <stdio.h>
  3. using namespace std;
  4. int main() {
  5. int a = 3633;
  6. // 将十进制转换为八进制
  7. char s1[20];
  8. sprintf(s1, "%o", a);
  9. cout << "八进制: " << s1 << std::endl;
  10. // 将十进制转换为十六进制
  11. char s2[20];
  12. // 小写字母表示
  13. sprintf(s2, "%x", a);
  14. cout << "十六进制(小写): " << s2 << std::endl;
  15. char s3[20];
  16. // 大写字母表示
  17. sprintf(s3, "%X", a);
  18. cout << "十六进制(大写): " << s3 << std::endl;
  19. return 0;
  20. }

本人水平有限,若有不足,欢迎指正! 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/721742
推荐阅读
相关标签
  

闽ICP备14008679号