#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. POJ2553 The Bottom of a Graph(强连通分量+缩点)

    题目是问,一个有向图有多少个点v满足∀w∈V:(v→w)⇒(w→v). 把图的强连通分量缩点,那么答案显然就是所有出度为0的点. 用Tarjan找强连通分量: #include<cstdio&g ...

  2. lua if

    function fact(n) then else ) end end print("输入一个数") a=io.read("*number") print(f ...

  3. BZOJ1075 : [SCOI2007]最优驾车drive

    设$f[i][j][k]$为到达$(i,j)$,用时为$\frac{k}{5lcm}$小时的最低耗油量,然后DP即可. #include<cstdio> const int N=12,M= ...

  4. 【wikioi】1913 数字梯形问题(费用流)

    http://wikioi.com/problem/1913/ 如果本题没有询问2和3,那么本题和蚯蚓那题一模一样.http://www.cnblogs.com/iwtwiioi/p/3935039. ...

  5. meta标签的用法

    meta是用来在HTML文档中模拟HTTP协议的响应头报文.meta 标签用于网页的<head>与</head>中,meta 标签的用处很多.meta 的属性有两种:name和 ...

  6. 针对特定浏览器起作用的CSS: IE Chrome Firefox CSS Hack

    Firefox的CSSHack 只在Firefox上应用的CSS Hack,虽然这种情况非常少,但有时也会碰到: @-moz-document url-prefix() { .cssSelector ...

  7. rsync服务器的配置和使用

    yum install -y rsyncuseradd rsync -s /sbin/nologinmkdir /backupmkdir /backup1 chown rsync:rsync /bac ...

  8. [转载]从GetSafeHwnd()和GetSafeHandle()分析句柄和指针

    GetSafeHwnd()和GetSafeHandle()的主要区别: 1.使用者不同: (1)窗体使用: GetSafeHwnd()用于获取窗体的安全句柄(即HWND),有了HWND我们就可以方便的 ...

  9. 启动Automatic Updates出现0x80004015错误的解决办法

    前几天我的本本加入到AD里面了,并且换了个用户名,结果昨天就发现升级出毛病了,Automatic Updates服务无法启动,启动时候出现0x80004015错误:Automatic Updates  ...

  10. Embedded Database service fails to start after installing or migrating to Symantec Endpoint Protection (SEP) 12.1.5 (RU5)

    https://support.symantec.com/en_US/article.TECH225587.html