#include <stdio.h>
#include <memory.h>
#include <malloc.h>
#define MaxBinLength 16 //获取无符号数的二进制,这是我自己写的,更简单的方法可以用bitset代替
char* getUnsignedBinary(unsigned int num)
{
int len = MaxBinLength -;
char *bin = (char*)malloc((MaxBinLength + )*sizeof(char));
memset(bin,'',MaxBinLength);
bin[MaxBinLength] = ;
while(num/ != ){
bin[len--] = '' + num%;
num/=;
}
if(num!=)
bin[len--] = '';
return bin;
} void flip(unsigned short num)
{
printf("位求反,运算符为 ~ ,功能简单,将操作数的每一个二进制位取反\n");
printf("原值:%6d %s\n",num,getUnsignedBinary(num));
printf("新值:%6d %s\n",~num,getUnsignedBinary(~num));
printf("-------------------------\n");
} void left_shift(unsigned short num,unsigned short offset)
{
printf("左移运算,运算符为 << ,将操作数的二进制位向左移动指定的offset(%d)位数,offset必须小于原数的位数,右边新加的位以0填充\n",offset);
printf("原值:%6d %s\n",num,getUnsignedBinary(num));
printf("新值:%6d %s\n",num<<offset,getUnsignedBinary(num<<offset));
printf("-------------------------\n");
} void right_shift(unsigned short num,unsigned short offset)
{
printf("右移运算,运算符为 >> ,将操作数的二进制位向右移动指定的offset(%d)位数,offset必须小于原数的位数,\n\
如果操作数无符号,左边新加的位以0填充,如果操作数有符号,右边新加的位可能以符号位填充,也可能以0填充,\n\
具体依赖于机器,见注释\n",offset);
printf("原值:%6d %s\n",num,getUnsignedBinary(num));
printf("新值:%6d %s\n",num>>offset,getUnsignedBinary(num>>offset));
printf("-------------------------\n");
} void weiyu(unsigned short num,unsigned short num_1)
{
printf("位与,运算符为 & ,对两个操作数的每一个对应二进制位进行'与'运算,运算方式类似于&&运算\n");
printf("原值:%6d %s\n",num,getUnsignedBinary(num));
printf("原值:%6d %s\n",num_1,getUnsignedBinary(num_1));
printf("新值:%6d %s\n",num&num_1,getUnsignedBinary(num&num_1));
printf("-------------------------\n");
} void weihuo(unsigned short num,unsigned short num_1)
{
printf("位或,运算符为 | ,对两个操作数的每一个对应二进制位进行'或'运算,运算方式类似于||运算\n");
printf("原值:%6d %s\n",num,getUnsignedBinary(num));
printf("原值:%6d %s\n",num_1,getUnsignedBinary(num_1));
printf("新值:%6d %s\n",num|num_1,getUnsignedBinary(num|num_1));
printf("-------------------------\n");
} void weiyihuo(unsigned short num,unsigned short num_1)
{
printf("位异或,运算符为 ^ ,对两个操作数的每一个对应二进制位进行'异或'运算,两个位不同则为1,相同则为0\n");
printf("原值:%6d %s\n",num,getUnsignedBinary(num));
printf("原值:%6d %s\n",num_1,getUnsignedBinary(num_1));
printf("新值:%6d %s\n",num^num_1,getUnsignedBinary(num^num_1));
printf("-------------------------\n");
} void zhushi()
{
printf("注释:位操作符只能操作整数,这个整数可以是有符号的也可以是无符号的,\n\
如果操作数为负数,则位如何处理其符号位依赖于机器,所以在一个环境中实现的\n\
程序可能无法用于另一环境,因此强烈建议使用unsigned整数作为操作数\n\
参考<<C++primer>>(人民邮电出版社第4版)155页\n");
printf("-------------------------\n");
} int main()
{
unsigned short num = ,num_1 = ,offset = ;
flip(num);
left_shift(num,offset);
right_shift(num,offset);
weiyu(num,num_1);
weihuo(num,num_1);
weiyihuo(num,num_1);
zhushi();
return ;
}

后来又自己试了一下,当在左移运算中,offset是可以大于操作数的长度的。当offset大一操作数长度的时候,操作的结果会自动更改整数类型,以容纳更多的位数,例如unsigned char可以变为short,short可以变为int等。

而右移运算中,无论offset为何值,操作结果的长度不会发证变化。

看demo,只是经过简单的验证。

 #include <bitset>
#include <iostream>
#include <iomanip>
using namespace std; #define uint8_t unsigned char
#define uint16_t unsigned short
#define uint32_t unsigned int bitset<> getBinary32(int num)
{
bitset<> bit(num);
return bit;
} bitset<> getBinary8(uint8_t num)
{
bitset<> bit(num);
return bit;
} int main()
{
uint8_t a = ;
//左移
cout<<"左移"<<endl<<"a="<<(int)a<<" "<<getBinary8(a)<<endl;
for(int i = ;i<=;i++)
{
if(i < )
{
uint16_t b = a<<i;
cout<<"b="<<setw()<<(unsigned short)b<<" "<<getBinary32(b)<<endl;
}
else
{
uint32_t b = a<<i;
cout<<"b="<<setw()<<(unsigned int)b<<" "<<getBinary32(b)<<endl;
}
} //右移
cout<<"右移"<<endl<<"a="<<(int)a<<" "<<getBinary8(a)<<endl;
for(i = ;i<=;i++)
{
if(i < )
{
uint16_t b = a>>i;
cout<<"b="<<setw()<<(unsigned short)b<<" "<<getBinary32(b)<<endl;
}
else
{
uint32_t b = a>>i;
cout<<"b="<<setw()<<(unsigned int)b<<" "<<getBinary32(b)<<endl;
}
}
return ;
}

C++位操作符总结的更多相关文章

  1. C#位操作符

    位操作符是对数据按二进制位进行运算的操作符.c#位操作符包括: 按位与 & 按位或 | 按位取反 ~ 左移 << 右移 >> 例如:   6:00000110 3:00 ...

  2. ECMAScript位操作符

    在ECMAScript中,有少数的几个操作符可以对二进制位进行直接操作,这几个操作符本身直接对二进制进行操作,所有它们的本身是非常效率的,学习这一段有助于以后的优化以及理解. ECMAScript中采 ...

  3. Java的按位操作符

    本文参考:Java的位操作符 Java的位操作符用来操作整数基本数据类型中的单个"比特"(bit),即代进制位.而我们知道比特就是0和1,那么,位操作就是对这些数据进行基本的操作. ...

  4. 浅谈JavaScript位操作符

    因为ECMAscript中所有数值都是以IEEE-75464格式存储,所以才会诞生了位操作符的概念. 位操作符作用于最基本的层次上,因为数值按位存储,所以位操作符的作用也就是操作数值的位.不过位操作符 ...

  5. 【关于Java移位操作符&按位操作符】

    一.java按位运算符(操作符) 这段时间偶尔看一下源码,会发现有很多很基础的java知识在脑海中已经慢慢的淡成不常用记忆,于是打算捡起来一些. 按位运算符是来操作整数基本数据类型中的单个“比特”(b ...

  6. 为什么不要在 JavaScript 中使用位操作符?

    如果你的第一门编程语言不是 JavaScript,而是 C++ 或 Java,那么一开始你大概会看不惯 JavaScript 的数字类型.在 JavaScript 中的数字类型是不区分什么 Int,F ...

  7. 原码、反码、补码及位操作符,C语言位操作

    计算机中的所有数据均是以二进制形式存储和处理的.所谓位操作就是直接把计算机中的二进制数进行操作,无须进行数据形式的转换,故处理速度较快. 1.原码.反码和补码 位(bit) 是计算机中处理数据的最小单 ...

  8. C++学习之【使用位操作符求素数分析】

    先放普通代码: #include <iostream> using namespace std; void getPrime_1() { const int MAXN = 100; boo ...

  9. 按位操作符(Bitwise operators)

    按位操作符(Bitwise operators) 将其操作数(operands)当作32位的比特序列(由0和1组成),而不是十进制.十六进制或八进制数值.例如,十进制数9,用二进制表示则为1001.按 ...

随机推荐

  1. Visual Studio提示Bonjour backend初始化失败

    Visual Studio提示Bonjour backend初始化失败 错误信息:The Bonjour backend failed to initialize, automatic Mac Bui ...

  2. http://love3400wind.blog.163.com/blog/static/7963080120132794359703/

    http://love3400wind.blog.163.com/blog/static/7963080120132794359703/

  3. 构造 hihocoder 1257 Snake Carpet (15北京I)

    题目传送门 题意:贪吃蛇,要求长度奇数的蛇转弯次数为正奇数,长度偶数转弯次数为正偶数,且组成矩形.(北大出的题咋都和矩形相关!!!) 分析:构造找规律,想到就简单了.可以构造 宽:(n + 1) / ...

  4. ZOJ3228 Searching the String(AC自动机)

    题目大概是给一个主串,询问若干个模式串出现次数,其中有些模式串要求不能重叠. 对于可以重叠的就是一个直白的多模式匹配问题:而不可重叠,在匹配过程中贪心地记录当前匹配的主串位置,然后每当出现一个新匹配根 ...

  5. 正则表达式学习日记zz

    1."."为通配符,表示任何一个字符,例如:"a.c"可以匹配"anc"."abc"."acc": ...

  6. topcoder SRM 593 DIV2 WolfDelaymaster

    #include <iostream> #include <string> #include <algorithm> using namespace std; cl ...

  7. UVA 10325 - The Lottery(容斥)

    以前做过的一个题,忘记/gcd了,看来需要把以前的东西看一下啊. #include <cstdio> #include <cstring> #include <iostr ...

  8. Solve error: Cannot open include file: 'X11/Xlocale.h': No such file or directory

    When you use FLTK with VS2010, you may get the error: fatal error C1083: Cannot open include file: ' ...

  9. Odoo(OpenERP) 多个子类重载同一个父类方法的执行顺序及如何调用父类的父类方法

    首先说下起因,在修改英国会计模块(没错,就是那个安格鲁撒克逊记账模式!)中不符合中国国情的部分供能时,碰到了一个棘手的问题,简单的说就是B类继承它的父类A并重载了A的方法M,同时C类也继承了A类也重载 ...

  10. thinkphp中文验证码不能显示的问题

    使用tp框架里的验证码,数字验证码能很好的显示出来,下面是实现的函数 function verify(){ import("ORG.Util.Image"); return Ima ...