#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. HDU4276 The Ghost Blows Light(树形DP+背包)

    题目大概说一棵n个结点树,每个结点都有宝藏,走过每条边要花一定的时间,现在要在t时间内从结点1出发走到结点n,问能获得最多的宝藏是多少. 放了几天的题,今天拿出来集中精力去想,还是想出来了. 首先,树 ...

  2. 【wikioi】1403 新三国争霸(dp+kruskal)

    http://wikioi.com/problem/1403/ 一开始的确感觉和bzoj1003很像,不同的是这里还要求联通,求最小的边. 我们可以想到用最小生成树(为嘛我自己想不到呢..) 我们可以 ...

  3. esper 事件引擎,各种事件类型示例代码

    原创文章 转载请注明出处 package com.hp.iot.engine.esper; import java.util.ArrayList; import java.util.HashMap; ...

  4. Add Customerlize Button in More Button List In Odoo

    There're two commen type of actions in odoo: ir.actions.server,ir.actions.client_multi 1.Using ir.ac ...

  5. 安卓学习笔记---Activity

    由于学期实训的要求,我开始学习安卓了.从本月一号开始,学了五天了.时间短,刚学到的东西容易忘,我记一下笔记. 首先是对Activity的理解.activity首先是一个java类,我们创建一个新的ac ...

  6. FreeBSD Intel SYSRET Kernel Privilege Escalation Exploit

    /* * FreeBSD 9.0 Intel SYSRET Kernel Privilege Escalation exploit * Author by CurcolHekerLink * * Th ...

  7. Linux环境下实现哲学家就餐问题

    #include <stdio.h> #include <stdlib.h> #include <memory.h> #include <pthread.h& ...

  8. Leetcode | Valid Sudoku & Sudoku Solver

    判断valid,没有更好的方法,只能brute force. class Solution { public: bool isValidSudoku(vector<vector<char& ...

  9. c3p0配置 initialPoolSize 和minPoolSize 可以设为0吗?设0有坏处吗?

    c3p0配置 initialPoolSize 和minPoolSize 可以设为0吗?设0有坏处吗? c3p0配置 initialPoolSize 和minPoolSize 可以设为0吗?设0有坏处吗 ...

  10. storm在linux系统下安装调试

    安装: 安装 zookeeper : 下载 zookeeper :http://zookeeper.apache.org/releases.html#download. 将 zookeeper-3.4 ...