#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. Google地图接口API之申请免费API Key(一)

    使用谷歌地图API V3创建交互式地图,首先需要拥有一个免费的 Google 地图 API key. 如果想调用Google地图的接口,首先需要拥有一个免费的 Google 地图 API key.想要 ...

  2. Codeforces Round #327 (Div. 2)

    题目传送门 水 A - Wizards' Duel 题目都没看清就写了,1e-4精度WA了一次... /************************************************ ...

  3. 模拟 POJ 2993 Emag eht htiw Em Pleh

    题目地址:http://poj.org/problem?id=2993 /* 题意:与POJ2996完全相反 模拟题 + 字符串处理:无算法,读入两行字符串找出相应点用used标记,输出时标记过的输出 ...

  4. Repeatless Numbers[POJ2956]

    Repeatless Numbers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1719   Accepted: 726 ...

  5. Noi2011 : 智能车比赛

    假设S在T左边,那么只能往右或者上下走 f[i]表示S到i点的最短路 f[i]=min(f[j]+dis(i,j)(i能看到j)) 判断i能看到j就维护一个上凸壳和一个下凸壳 时间复杂度$O(n^2) ...

  6. BZOJ3673 : 可持久化并查集

    题目没有强制在线! 考虑离线做法. 把操作建立成一棵树的结构,然后按照欧拉序遍历,每次转移要么是一次合并操作,要么是一次撤销合并操作,可以看成是分离操作. 用LCT维护集合,合并就是加边,分离就是删边 ...

  7. BZOJ4408: [Fj Winter Camp 2016]神秘数

    Description 一个可重复数字集合S的神秘数定义为最小的不能被S的子集的和表示的正整数.例如S={1,1,1,4,13}, 1 = 1 2 = 1+1 3 = 1+1+1 4 = 4 5 = ...

  8. JS模态窗口返回值兼容问题解决方案

    因系统要兼容原IE已使用的关闭方法,经调试测得,需对window.dialogArguments进行再较验,不然易出问题. function OKEnd(vals) { if (vals == nul ...

  9. Hibernate工作原理及为什么要用?

    Hibernate工作原理及为什么要用? 原理:1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件2.由hibernate.cfg.x ...

  10. Stack and Heap 堆和栈的区别

    在和计算机内存打交道时,我们一定会碰到堆和栈,这两个东西很容易搞混,那么现在就来梳理一下二者的关系. 栈是用来静态分配内存的而堆是动态分配内存的,它们都是存在于计算机内存之中. 栈的分配是在程序编译的 ...