C++位操作符总结

#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++位操作符总结的更多相关文章
- C#位操作符
位操作符是对数据按二进制位进行运算的操作符.c#位操作符包括: 按位与 & 按位或 | 按位取反 ~ 左移 << 右移 >> 例如: 6:00000110 3:00 ...
- ECMAScript位操作符
在ECMAScript中,有少数的几个操作符可以对二进制位进行直接操作,这几个操作符本身直接对二进制进行操作,所有它们的本身是非常效率的,学习这一段有助于以后的优化以及理解. ECMAScript中采 ...
- Java的按位操作符
本文参考:Java的位操作符 Java的位操作符用来操作整数基本数据类型中的单个"比特"(bit),即代进制位.而我们知道比特就是0和1,那么,位操作就是对这些数据进行基本的操作. ...
- 浅谈JavaScript位操作符
因为ECMAscript中所有数值都是以IEEE-75464格式存储,所以才会诞生了位操作符的概念. 位操作符作用于最基本的层次上,因为数值按位存储,所以位操作符的作用也就是操作数值的位.不过位操作符 ...
- 【关于Java移位操作符&按位操作符】
一.java按位运算符(操作符) 这段时间偶尔看一下源码,会发现有很多很基础的java知识在脑海中已经慢慢的淡成不常用记忆,于是打算捡起来一些. 按位运算符是来操作整数基本数据类型中的单个“比特”(b ...
- 为什么不要在 JavaScript 中使用位操作符?
如果你的第一门编程语言不是 JavaScript,而是 C++ 或 Java,那么一开始你大概会看不惯 JavaScript 的数字类型.在 JavaScript 中的数字类型是不区分什么 Int,F ...
- 原码、反码、补码及位操作符,C语言位操作
计算机中的所有数据均是以二进制形式存储和处理的.所谓位操作就是直接把计算机中的二进制数进行操作,无须进行数据形式的转换,故处理速度较快. 1.原码.反码和补码 位(bit) 是计算机中处理数据的最小单 ...
- C++学习之【使用位操作符求素数分析】
先放普通代码: #include <iostream> using namespace std; void getPrime_1() { const int MAXN = 100; boo ...
- 按位操作符(Bitwise operators)
按位操作符(Bitwise operators) 将其操作数(operands)当作32位的比特序列(由0和1组成),而不是十进制.十六进制或八进制数值.例如,十进制数9,用二进制表示则为1001.按 ...
随机推荐
- DP(01背包) UESTC 1218 Pick The Sticks (15CCPC C)
题目传送门 题意:长度为L的金条,将n根金棍尽可能放上去,要求重心在L上,使得价值最大,最多有两条可以长度折半的放上去. 分析:首先长度可能为奇数,先*2.然后除了两条特殊的金棍就是01背包,所以dp ...
- EF Code First 数据库迁移Migration剖析
1.简介 Entity Framework 的Code First 方式,提供了一种方式:编写模型Model,生成模型变更,根据模型变更修改数据库. 而其所以来的环境就是强大的Nuget,如果还在是V ...
- ural 1247. Check a Sequence
1247. Check a Sequence Time limit: 0.5 secondMemory limit: 64 MB There is a sequence of integer numb ...
- C# 文件读写FileInfo
using System; using System.Collections.Generic; using System.Text; using System.IO; namespace Consol ...
- 洛谷 P1118 数字三角形游戏 Label:dfs
题目描述 有这么一个游戏: 写出一个1-N的排列a[i],然后每次将相邻两个数相加,构成新的序列,再对新序列进行这样的操作,显然每次构成的序列都比上一次的序列长度少1,直到只剩下一个数字位置.下面是一 ...
- TYVJ P1023 奶牛的锻炼 Label:dp
背景 USACO 描述 奶牛Bessie有N分钟时间跑步,每分钟她可以跑步或者休息.若她在第i分钟跑步,可以跑出D_i米,同时疲倦程度增加1(初始为0).若她在第i分钟休息,则疲倦程度减少1.无论何时 ...
- python 操作execl文件
http://www.jb51.net/article/60510.htm import xlrdimport xlwt # 打开文件 workbook = xlrd.open_workbook( ...
- CentOS mysql硬盘满了挂载阿里云硬盘
前提,昨天晚上导入数据库到本地时候发现硬盘满了,出了,好多错,这边在目录下新建了一个/mysql这样的数据库目录,再将/etc/my.cnf 下的datadir 指向到/mysql下,就可以了 阿里云 ...
- HDU 4031 Attack(线段树/树状数组区间更新单点查询+暴力)
Attack Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others) Total Sub ...
- FZU 1025 状压dp 摆砖块
云峰菌曾经提到过的黄老师过去讲课时的摆砖块 那时百度了一下题目 想了想并没有想好怎么dp 就扔了 这两天想补动态规划知识 就去FZU做专题 然后又碰到了 就认真的想并且去做了 dp思想都在代码注释里 ...