位操作允许程序员对单独的位进行操作,例如,早某些机器上,短整型占16位,位操作将每一位单独操作。

位操作允许程序员设置、清除、测试与其他的操作,这些操作如下表:

操作 含义
& 按位与
| 按位或
^ 按位异或
~ 取反
<< 左移
>> 右移

这些操作用于整型或者字符型

1、按位与(&)

Bit1 Bit2 Bit1 & Bit2
0 0 0
0 1 0
1 0 0
1 1 1

通常我们可把按位“与”操作 & 作为关闭某位(即将该位置0)的手段,例如我们想要关闭a数中的第3位,而又不影响其它位的现状,可以用一个数0xF7,即二进制数1111 0111去与a数作按位“与”运算:

    0x88 1000 1000 a数

& 0xF7 1111 0111 屏蔽数

   =       1000 0000

注意,这个数除第3位为0外,其它各位均为1,操作的结果只会将a数中的第3位置0,而a数的其它位不受影响。也就是说,若需要某个数的第n位关闭,只需要将该数与另一个数按位相与,另一个数除了相应的第n位为0外,其它各位都为1,以起到对其它各位的屏蔽作用。

应用举例:判断一个数字的奇偶性

由于在二进制下,当最后一个数字为0,则此数字为偶数,若为1则此数为奇数

代码如下:

int even(const int value)
{
return ((value & 1)==0);
}

2、按位或(|)

Bit1 Bit2 Bit1 | Bit2
0 0 0
0 1 1
1 0 1
1 1 1

通常我们可把按位“或”操作 | 作为置位(即将该位置1)的手段,例如我们想要将a数中的第0位和1位置1,而又不影响其它位的现状,可以用一个数0x03,即二进制数00000011去与a数作按位“或”运算:

0x88 1000 1000 a数

| 0x03 0000 0011 屏蔽数

   =     1000 1011

注意,这个数除第0、1位为1外,其它各位均为0,操作的结果只会将a数中的第0、1位置1,而a数的其它位不受影响。也就是说,若需要某个数的第n位置1,只需要将该数与另一个数按位相“或”,另一个数除了相应的第n位为1外,其它各位都为0,以起到对其它各位的屏蔽作用。

3、按位异或(^)

Bit1 Bit2 Bit1 ^ Bit2
0 0 0
0 1 1
1 0 1
1 1 0

按位“异或”运算 ^ 具有一些特殊的应用,介绍如下:

① 按位“异或”运算可以使特定的位取反

例如:我们想让a数中的最低位和最高位取反,只要用0x81,即二进制数10000001去与它作按位“异或”运算,其运算结果同上式。经过操作后,最高位的值已经由1变0,而最低位的值也已经由0变1,起到了使这两位翻转的效果。其它位的状态保持不变。

可以看到,这个数除最低位、最高位为1外,其它各位均为0,操作的结果只会将a数中的第0、7位取反,而a数的其它位不受影响。也就是说,若需要某个数的第n位取反,只需要将该数与另一个数按位相“异或”,另一个数除了相应的第n位为1外,其它各位都为0,以起到对其它各位的屏蔽作用。上面的运算可以用a = a ^ (0x81) 来表示,也可以用a ^ =(0x81) 来表达。

② 直接交换两个变量的值

例如,若有变量a = 3,b = 4,想要交换它们的值,可以做如下一组操作:

a ^ = b

b ^ = a

a ^ = b

首先,a ^ = b:

    a 0000 0011

^ b 0000 0100

a =  0000 0111

其次,b ^ = a:

    b 0000 0100

^ a 0000 0111

b =  0000 0011

最后,a ^ = b:

    a 0000 0111

^ b 0000 0011

a =  0000 0100

这样,a、b两个变量中的值就进行了对调。

4、按位取非(~)

Bit ~Bit
0 1
1 0

5、左移操作(<<)与右移操作(>>)

对于x,x<<n相当于x^n,x>>n相当于x/(2^n)

6、右移操作详解:

右移操作相当的诡异,当一个变量进行右移操作,C语言需要填充左边空的比特位

然而对于有符号变量,C使用符号位,如下表:

signed char signed char unsigned char
表达式 9>>2 -8>>2 248>>2
Binary Value>>2 0000 1010>>2 1111 1000>>2 1111 1000>>2
结果 ??00 0010 ??11 1110 ??11 1110
填充 Sign Bit(0) Sign Bit(1) 0
最终结果(二进制) 0000 0010 1111 1110 0011 1110
最终结果(短整型) 2 -2 62

C语言位操作初步的更多相关文章

  1. C语言 位操作

    c语言位操作中需要注意有: 位操作只针对整型和字符型数据 在右移操作中:对无符号数和有符号中的正数补 0:符号数中的负数,取决于所使用的系统:补 0 的称为“逻辑右移”,补 1 的称为“算术右移”. ...

  2. 关于SQL语言的初步认识

    关于SQL语言的初步认识 1.一个SQL数据库是表(Table)的集合,它由一个或多个SQL模式定义. 2.一个SQL表由行集构成,一行是列的序列(集合),每列与行对应一个数据项. 3.一个表或者是一 ...

  3. 原码、反码、补码及位操作符,C语言位操作

    计算机中的所有数据均是以二进制形式存储和处理的.所谓位操作就是直接把计算机中的二进制数进行操作,无须进行数据形式的转换,故处理速度较快. 1.原码.反码和补码 位(bit) 是计算机中处理数据的最小单 ...

  4. 嵌入式、C语言位操作的一些技巧汇总

    下面分享关于位操作的一些笔记: 一.位操作简单介绍 首先,以下是按位运算符: 在嵌入式编程中,常常需要对一些寄存器进行配置,有的情况下需要改变一个字节中的某一位或者几位,但是又不想改变其它位原有的值, ...

  5. C语言位操作的算法

    1.头文件 #ifndef _INC_BITOPERATION #define _INC_BITOPERATION #endif /* 封装了所有的位操作运算 */ #include<stdio ...

  6. C语言位操作(转)

    http://www.cnblogs.com/cpoint/category/524132.html  

  7. C语言位操作

    #include <stdio.h> void print(int); int main(void) { int flag = 0xffe4; print(flag); printf(&q ...

  8. C语言_初步了解一下指针

    指针的基本概念 在计算机中,所有的数据都是存放在存储器中的. 一般把存储器中的一个字节称为一个内存单元, 不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1个单元等.为了正确地访问这 ...

  9. C语言位操作--逻辑运算符组合

    假设读者熟悉普通代数与布尔代数,下面是部分常见的涉及到加法.减法与逻辑运算符的组合: a.        -x=~x+1 b.           =~(x-1) c.        ~x=-x-1 ...

随机推荐

  1. fedora26 编译内核出现Can't use 'defined(@array)' 错误

    cd /kernel/ vim timeconst.pl 把373行中的if (!defined(@val)) { 改为if (!@val) {

  2. Mac下配置Oracle数据库客户端远程连接数据库服务器

    下载mac数据库客户端: 地址:http://www.oracle.com/technetwork/topics/intel-macsoft-096467.html 下载这俩个:(来源:http:// ...

  3. Masonry插件:内容始终水平居中

    跟随浏览器框架大小,主题内容居中 代码 <!DOCTYPE html> <html> <head> <title>masonry瀑布流插件</ti ...

  4. lua:值得看的博客资源 ...

    凯奥斯 :https://blog.csdn.net/ecidevilin/article/category/6454847 https://blog.csdn.net/qinyuanpei/arti ...

  5. 研究jenkins集成unittest成图

    jenkins搭建完毕,unittest代码编写完毕,触发unittest执行测试的脚本和任务编写完毕,接下来研究生成的结果在页面的可视化. 方案: highcharts 参考资料: http://b ...

  6. [CNN] Face Detection

    即将进入涉及大量数学知识的阶段,先读下“别人家”的博文放松一下. 读罢该文,基本能了解面部识别领域的整体状况. 后生可畏. 结尾的Google Facenet中的2亿数据集,仿佛隐约听到:“你们都玩儿 ...

  7. Linq与Lambda

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button ...

  8. PHP从数组中找到指定元素的位置

    群里有人问,有个数组五个元素 分为1到5  现在要求 循环找出3元素的索引,怎么做性能才是最高. 我不知道哪个性能最高,但是我想提出可以用多种方式进行查找,然后进行比较选择. 我想,最简单最基础的 应 ...

  9. SpringBoot(十)-- 整合MyBatis

    1.pom.xml 配置maven依赖 <dependency> <groupId>org.mybatis.spring.boot</groupId> <ar ...

  10. Memcached 数据导出与导入

    我们使用 memcached-tool 命令来导出数据: [root@localhost ~]# memcached-tool dump > /tmp/.txt Dumping memcache ...