C语言位操作初步
位操作允许程序员对单独的位进行操作,例如,早某些机器上,短整型占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语言位操作初步的更多相关文章
- C语言 位操作
c语言位操作中需要注意有: 位操作只针对整型和字符型数据 在右移操作中:对无符号数和有符号中的正数补 0:符号数中的负数,取决于所使用的系统:补 0 的称为“逻辑右移”,补 1 的称为“算术右移”. ...
- 关于SQL语言的初步认识
关于SQL语言的初步认识 1.一个SQL数据库是表(Table)的集合,它由一个或多个SQL模式定义. 2.一个SQL表由行集构成,一行是列的序列(集合),每列与行对应一个数据项. 3.一个表或者是一 ...
- 原码、反码、补码及位操作符,C语言位操作
计算机中的所有数据均是以二进制形式存储和处理的.所谓位操作就是直接把计算机中的二进制数进行操作,无须进行数据形式的转换,故处理速度较快. 1.原码.反码和补码 位(bit) 是计算机中处理数据的最小单 ...
- 嵌入式、C语言位操作的一些技巧汇总
下面分享关于位操作的一些笔记: 一.位操作简单介绍 首先,以下是按位运算符: 在嵌入式编程中,常常需要对一些寄存器进行配置,有的情况下需要改变一个字节中的某一位或者几位,但是又不想改变其它位原有的值, ...
- C语言位操作的算法
1.头文件 #ifndef _INC_BITOPERATION #define _INC_BITOPERATION #endif /* 封装了所有的位操作运算 */ #include<stdio ...
- C语言位操作(转)
http://www.cnblogs.com/cpoint/category/524132.html
- C语言位操作
#include <stdio.h> void print(int); int main(void) { int flag = 0xffe4; print(flag); printf(&q ...
- C语言_初步了解一下指针
指针的基本概念 在计算机中,所有的数据都是存放在存储器中的. 一般把存储器中的一个字节称为一个内存单元, 不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1个单元等.为了正确地访问这 ...
- C语言位操作--逻辑运算符组合
假设读者熟悉普通代数与布尔代数,下面是部分常见的涉及到加法.减法与逻辑运算符的组合: a. -x=~x+1 b. =~(x-1) c. ~x=-x-1 ...
随机推荐
- Tomcat域名绑定
域名绑定与虚拟目录设置: conf/server.xml 的修改方式如下: 单个域名绑定: 原始: <Engine name="Catalina" defaultHost=& ...
- 腾讯爱玩某处csrf导致骚扰用户(QQ弹窗+QQ会话+微博)
点击提醒,然后抓包: POST /dyid_proc.php HTTP/1.1 Host: tx.qq.com User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW ...
- fdisk mkfs blkid fstab
fdisk -l 查看系统分区信息 mkfs 制作文件系统mke2fs 制作ext型文件系统mkntfs 制作ntfs型文件系统 e2label 更改ext型文件系统卷标ntfslabel 更 ...
- mysql中explain
1.select_type: /* select_type 使用 SIMPLE */explain select * from tb_shop_order where id='201603292570 ...
- Python 程序员都会喜欢的 6 个库
在编程时,小挫折可能与大难题一样令人痛苦.没人希望在费劲心思之后,只是做到弹出消息窗口或是快速写入数据库.因此,程序员都会喜欢那些能够快速处理这些问题,同时长远来看也很健壮的解决方案. 下面这6个Py ...
- ios7注意事项随笔
1,修改状态栏的样式和隐藏. 首先,需要在Info.plist配置文件中,增加键:UIViewControllerBasedStatusBarAppearance,并设置为YES: 然后,在UIVie ...
- 一些JavaScript基本函数
1.document.write(”");为 输出语句 2.JS中的注释为// 3.传统的HTML文档顺序是:document->html->(head,body) 4.一个浏览 ...
- 8 -- 深入使用Spring -- 1...2 Bean后处理器的用处
8.1.2 Bean后处理器的用处 Spring提供的两个常用的后处理器: ⊙ BeanNameAutoProxyCreator : 根据Bean实例的name属性,创建Bean实例的代理. ⊙ De ...
- 线程同步 –Mutex和Semaphore
上一篇介绍了同步事件EventWaitHandle,以及它的两个子类型AutoResetEvent和ManualResetEvent.下面接着介绍WaitHandle的另外两个子类型Mutex和Sem ...
- mongodb安装使用笔记
mongodb安装使用 安装后配置环境变量 创建数据库文件夹并连接数据库,并执行mongod --dbpath c:\workname 打开新的cmd,执行mongo命令,管理数据库 show dbs ...