二进制补码表示法

几乎所有的计算机都使用二进制补码表示法来存储位于n位存储单元中的有符号整数。

   在二进制补码表示法中,最左位决定符号。如果它是0,该整数为正(即非负);如果是1,该整数为负。

   两种运算:

  1. 反码(或取一个整数的反码):简单反转各个位,即把0位变为1位,把1位变为0位。
  2. 补码(或取一个整数的补码):方法一,首先,从右边复制位,直到有1被复制;接着,反转其余的位。方法二,先对它进行1次反码运算再加上1得到结果。

以二进制补码格式存储整数,计算机遵循以下步骤:

  • 将整数变成n位的二进制数
  • 如果整数是正数或零,以其原样存储;如果是负数,计算机取其补码存储。

以二进制补码格式还原整数,计算机遵循以下步骤:

  • 如果最左位是1,计算机取其补码。如果最左位是0,计算机不进行操作。
  • 计算机将该整数转换为十进制

二进制补码表示法只有一个0。

 位逻辑运算符

1° 二进制反码或按位取反:~

2° 位与(AND):&

对于每个位,只有两个操作数的对应位都为1时结果才为1(用真/假来描述,只有两个位操作数都为真结果才为真)。C也有一个组合的位与-赋值运算符:&=,例:

val &= ;
val = val & ;

3° 位或(OR):|

对于每个位,如果其中任意操作数中对应的位为1,那么结果位为就为1(用真/假来描述,如果任意一个位操作数为真,或两个都为真,那么结果为真)。C也有一个组合的位或-赋值运算符:|=

4° 位异或:ˆ

对于每个位,如果操作数中的对应位有一个为1(但是不都为1),那么结果为1(用真/假来描述,如果两个位操作数中有一个为真,但是不都为真,那么结果为真)。C也有一个组合的位异或-赋值运算符:ˆ=

4个位运算符用于整数数据,包括char。将这些运算符称为位运算符的原因是它们对每位进行操作,而不影响左右两侧的位。请不要将这些运算符与常规的逻辑运算符相混淆(&&、||、!),常规的逻辑运算符对整个值进行操作。

移位运算符

1° 左移:<<

左移运算符<<将其左侧操作数的值的每位向左移动,移动的位数由其右侧操作数指定。空出的位用0填充,并且丢弃移出左侧操作数末端的位。可以使用左移-赋值运算符(<<=)来实际改变一个变量的值。该运算符将变量中的位向左移动右侧值大小的位置。

2° 右移:>>

右移运算符>>将其左侧操作数的值的每位向右移动,移动的位数由其右侧操作数指定。丢弃移出左侧操作数右端的位。对于unsigned类型,使用0填充左端空出的位。对于有符号类型,结果依赖于机器。空出的位可能用0填充,或者使用符号(最左端的)位的副本填充。右移-赋值运算符(>>=)将左侧变量的位向右移动指定数量的位置。

移位运算符能够提供快捷、高效的(依赖于硬件)对于2的幂的乘法和除法:

number << n number乘以2的n次幂
number >> n 如果number非负,则用number除以2的n次幂

 位字段

位字段是一个signed int或unsigned int中一组相邻的位(C99还允许_Bool类型位字段)。位字段由一个结构声明建立,该结构声明为每个字段提供标签,并决定字段的宽度。例如,以下建立了4个1位字段:

struct {
unsigned int autfd: ;
unsigned int bldfc: ;
unsigned int undln: ;
unsigned int itals: ;
} prnt;

↓ 使用普通的结构成员运算符将值赋给单独的字段

prnt.itals = ;
prnt.undln = ;

prnt变量存储在一个int大小的存储单元中,但仅有其中的4位被调用。

字段不限于1位大小。

struct {
unsigned int code1: ;
unsigned int code2: ;
unsigned int code3: ;
} prcode;

↓ 这段代码创建两个2位字段和一个8位字段(只须确保值没有超出字段的容量)

prcode.code1 = ;
prcode.code1 = ;
prcode.code1 = ;

问题:如果您所声明的总位数超过一个unsigned int大小,那么将会发生什么?

答:那将会使用下一个unsigned int存储位置。不允许一个字段跨越两个unsigned int之间的边界。编译器自动地移位一个这样的字段定义,使字段按unsigned int边界对齐。

发生这种情况时,会在第一个unsigned int中留下一个未命名的洞。

可以使用未命名的字段宽度“填充”未命名的洞。使用一个宽度为0的未命名的字段迫使下一个字段与下一个整数对齐:

struct {
unsigned int field1: ;
unsigned int : ;
unsigned int field2: ;
unsigned int : ;
unsigned int field3: ;
} stuff; // stuff.field1和stuff.field2之间有一个2位的间隙,stuff.field3存储在下一个int中

位字段往往难以移植,所以,把它们用于不可移植的用途,例如按照某个特定硬件设备所使用的确切格式来存放数据。

C Primer Plus之位操作的更多相关文章

  1. C语言学习书籍推荐《C Primer Plus(中文版)(第5版)》下载

    普拉塔 (Prata S.) (作者), 云巅工作室 (译者) <C Primer Plus(中文版)(第5版)>共17章,介绍了C语言的基础知识,包括数据类型.格式化输入输出.运算符.表 ...

  2. 《C Primer Plus(第6版)(中文版)》普拉达(作者)epub+mobi+azw3

    内容简介 <C Primer Plus(第6版)中文版>详细讲解了C语言的基本概念和编程技巧. <C Primer Plus(第6版)中文版>共17章.第1.2章介绍了C语言编 ...

  3. 关于C primer plus 的学习计划(暂停)

    最近想学数据结构,但是C的基础不够好,想借着C primer plus补一下基础.怎料第一章看的还挺快,到第二章看了二十多天.现在改改阅读方式:每日在这里添加进度,然后精看例题习题和章总结,其它简略看 ...

  4. C Primer Plus(三)

    重读C Primer Plus ,查漏补缺 重读C Primer Plus,记录遗漏的.未掌握的.不清楚的知识点 文件输入/输出 1.fgets函数在读取文件内容时会将换行符读入,但gets不会,fp ...

  5. C Primer Plus 学习体会

    本月刚刚开始学习<C primer plus>,之前课上草草学过一遍,讲到指针就结束了.现在重新开始看感觉难度不大只是刚开始接触有些语言细节比较琐碎.学习这一周的体会如下: 诸多前辈推荐的 ...

  6. C++ Primer Plus 第六版笔记

    C++ Primer Plus 第六版笔记 关于对象声明的思考 转自:http://www.cnblogs.com/weiqubo/archive/2009/11/02/1930042.html C+ ...

  7. 《3D Math Primer for Graphics and Game Development》读书笔记2

    <3D Math Primer for Graphics and Game Development>读书笔记2 上一篇得到了"矩阵等价于变换后的基向量"这一结论. 本篇 ...

  8. 《3D Math Primer for Graphics and Game Development》读书笔记1

    <3D Math Primer for Graphics and Game Development>读书笔记1 本文是<3D Math Primer for Graphics and ...

  9. 《Entity Framework 6 Recipes》中文翻译系列 (19) -----第三章 查询之使用位操作和多属性连接(join)

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-16  过滤中使用位操作 问题 你想在查询的过滤条件中使用位操作. 解决方案 假 ...

随机推荐

  1. 初探oracle删除重复记录,只保留rowid最小的记录

    如题,初探oracle删除重复记录,只保留rowid最小的记录(rowid可以反映数据插入到数据库中的顺序) 一.删除重复记录可以使用多种方法,如下只是介绍了两种方法(exist和in两种). 1.首 ...

  2. mac 系统开发android,真机调试解决方案

    1.确保你的android设备真正链接到电脑上了,我在这里遇到过坑,弄了好久,才发现能充电的线,确无法传递数据过去.所以不要以为随便拿一根线,能充电,就可以传递数据了,我就是这么傻傻的拿了根不能用的数 ...

  3. 007--VS2013 C++ 显示位图半透明化

    以后所有图片都放在根目录下: 如有另放,会特别注明 //全局变量HBITMAP bg,girl;HDC mdc; //起始坐标const int xstart = 50;const int ystar ...

  4. Win8.1+vs2012+osg环境搭建

    Win8.1+vs2012+osg环境搭建 一.    相关准备 a) Osg源码 当前最新版:OpenSceneGraph-3.2.0.zip 下载链接: http://www.opensceneg ...

  5. Java Day 12

    包 编译格式 javac -d . **.java 包之间的访问 类找不到: 类名写错,包名.类名 包不存在:指定classpath 其他包的类无法访问:权限 public protected 包导入 ...

  6. 微软职位内部推荐-Senior Software Development Engineer H/F

    微软近期Open的职位: Microsoft Engineering Center Paris (Xbox Music et Video) : Ingénieur en développement l ...

  7. 11.3Daily Scrum

    人员 任务分配完成情况 明天任务分配 王皓南 实现网页上视频上传的功能,研究相关的代码782 数据库测试 申开亮 实现网页上视频浏览的功能.研究相关的代码和功能.783 实现视频浏览的功能 王宇杰 负 ...

  8. 【每日scrum】NO.7

    Yesterday:学习和设计路线的编程 Today:编写代码 Problem:.在设计查询参观路线的时候,整个逻辑特别的混乱,设想了各种树,图以及网的遍历问题,但经过多次与同学的交流以及网上的查询资 ...

  9. 用hoverclock插件实现HTML5时钟

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  10. C#打印页面的纸张设置问题Spread表格控件

    这段时间学习spread控件,用到打印设置上边,其他的设置都还好说,但是打印纸张的大小,纸张类型等把我折腾的够呛,找了半天才找到,记录下来备查. 1.打印纸张类型: System.Drawing.Pr ...