C语言之位运算

位运算

1).定义.

指的是1个二进制数据的每一位来参与运算.

位运算的前提: 是这个数必须是1个二进制.

注意:

a). 参与位运算的二进制数据必须是补码形式.

b). 位运算的结果也是二进制的补码形式.

2).按位与: &

参与按位与的两个二进制数.如果都为1 那么结果就为1 只要有1位为0 那么结果就为0.

3 & 2;

第1步骤:先得到两个数的二进制补码形式.

3的补码: 00000000 00000000 00000000 00000011

2的补码: 00000000 00000000 00000000 00000010

-------------------------------------------------------

00000000 00000000 00000000 00000010   2

-3 & 4;

-3的原码:10000000 00000000 00000000 00000011

-3的反码:11111111 11111111 11111111 11111100

-3的补码:11111111 11111111 11111111 11111101

4的补码: 00000000 00000000 00000000 00000100

------------------------------------------------------

00000000 00000000 00000000 00000100

-3 & -4;

-4的原码: 10000000 00000000 00000000 00000100

-4的反码: 11111111 11111111 11111111 11111011

-3的补码:11111111 11111111 11111111 11111101

-4的补码:11111111 11111111 11111111 11111100

-----------------------------------------------------

11111111 11111111 11111111 11111100

结果是补码: 现将其还原为反码

反码:      11111111 11111111 11111111 11111011

原码:      10000000 00000000 00000000 00000100

注意:

任何数按位与1的结果是:是这个数的最低位.

10 & 1

xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxx0

00000000 00000000 00000000 00000001

------------------------------------

00000000 00000000 00000000 00000000

偶数的最低位一定是0. 奇数的最低为一定是1

所以,如果要判断这个数是奇数还是偶数 只要用这个数按位与1就可以了.

如果结果为1 那么就是奇数 如果结果为0 那么结果就是偶数.

int num = 10;

if((num & 1) == 0)

{

偶数.

}

else

{

奇数.

}

3). 按位或. |

参与按位或的二进制数据 只要有1位是1 那么结果就为1  只有当两位都是0的时候结果才为0

3 | 2;

3的补码: 00000000 00000000 00000000 00000011

2的补码: 00000000 00000000 00000000 00000010

------------------------------------------------------

00000000 00000000 00000000 00000011

-3 | 4

-3的补码:11111111 11111111 11111111 11111101

4的补码: 00000000 00000000 00000000 00000100

------------------------------------------------------

11111111 11111111 11111111 11111101

结果是1个负数.

反码: 11111111 11111111 11111111 11111100

原码: 10000000 00000000 00000000 00000011

-3 | -4

-3的补码:11111111 11111111 11111111 11111101

-4的补码:11111111 11111111 11111111 11111100

-------------------------------------------------------

11111111 11111111 11111111 11111101

4). 按位取反: ~

单目运算符. 将这个二进制数的每一位取反.

~3;

3的补码: 00000000 00000000 00000000 00000011

11111111 11111111 11111111 11111100 补码

11111111 11111111 11111111 11111011 反码

10000000 00000000 00000000 00000100 原码

5). 按位异或: ^

参与按位异或的二进制数据的位 如果相同则为0 不同为1.

3 ^ 2;

00000000 00000000 00000000 00000011   3的补码

00000000 00000000 00000000 00000010   2的补码

--------------------------------------

00000000 00000000 00000000 00000001   1

交换两个变量的值可以用异或运算.

int a = 3;

int b = 2;

a = a ^ b;  a = 1

b = a ^ b;  b = 3

a = a ^ b;  b = 2

1 ^ 2

00000000 00000000 00000000 00000001

00000000 00000000 00000000 00000010

-------------------------------------------------------

00000000 00000000 00000000 00000011                      3

00000000 00000000 00000000 00000001

00000000 00000000 00000000 00000011

------------------------------------------------------

00000000 00000000 00000000 00000010                      2

6). 按位左移运算. <<

参与按位左移运算的二进制数据. 向左移动指定的位数. 低位不够补0 高位溢出就丢弃.

3 << 2;

00000000 00000000 00000000 00000011

000000 00000000 00000000 0000001100

12

注意:

a). 左移运算有可能会改变其正负性.

b). 将1个数左移n位,相当于将这个数 乘以 2的n次方.

3 << 2    3乘以2的2次方.

16 << 3;   16 * 8  128

5 * 16 = ????

5 << 4

7). 按位右移. >>

参与按位右移的二进制数据.向右移动指定的位数. 低位溢出丢弃,高位补符号位.

3 >> 2;

00000000 00000000 00000000 00000011

0000000000 00000000 00000000 000000

16 >> 2;

00000000 00000000 00000000 00010000

00000000 00000000 00000000 000100

-16 >> 3

10000000 00000000 00000000 00010000

11111111 11111111 11111111 11101111

11111111 11111111 11111111 11110000

11111111111 11111111 11111111 11110

11111111111 11111111 11111111 11101 反码

10000000000 00000000 00000000 00010

注意.

a). 右移运算不会改变正负性.

b). 1个数按位右移n位.相当于这个数除以2的n次方.

100 >> 2  相当于 100 / 4

时间: 2024-10-11 07:42:02

C语言之位运算的相关文章

巧用c语言的位运算代替部分求余%计算

网上看到一个文章,里面讲述了四种高效c语言执行的方法, 1.使用空间代替时间 2.使用数学优化,而不是死计算,笨计算 3.使用位运算 4.使用嵌入汇编 前三点比较容易掌握,第四点基本上需要有比较深厚的汇编基础. 这里讲讲位运算, 1.无符号数据中, 左移1位,等价于除以2,右移1位,等价于乘以2,,切记不可溢出. 2.求余数, J = 456 % 32; ——456 - (456 >> 5 << 5);k = 456 % 64; ——456 - (456 >> 6 &l

嵌入式C语言之位运算 &amp;..|.~.&gt;&gt;

在嵌入式编程中,掌握位运算在操作寄存器的时候很方便,由于之前在上位运算的时候没上,但是由于位运算的难度不是很大,自己编写程序,顺便做些总结. &   |   - 这三个位运算符号不难理解,但是要区别与逻辑运算符号&&  和|| 1.需要总结的是:假如要使寄存器的值为1的话,一般用 这个寄存器的值来| 上1 比如要将i的值变为1则可以使用    i   |=  1;    意思就是将i的值与上1的值再给i.同理要让一个变量的值变成0的话,将使用 &上0     例如   i&

C语言的位运算

位运算加速技巧1. 如果乘上一个2的倍数数值,可以改用左移运算(Left Shift) 加速 300% x = x * 2;x = x * 64;//改为:x = x << 1; // 2 = 21x = x << 6; // 64 = 26 2. 如果除上一个 2 的倍数数值,可以改用右移运算加速 350% x = x / 2;x = x / 64;//改为: x = x >> 1;// 2 = 21x = x >> 6;// 64 = 26 3. 数值转

IOS开发学习记录第9天之C语言学习-----位运算

一.位运算介绍 1.运算符:& | ^ ~ << >> 用途: 直接操作二进制,省内存,效率高. 注意 只能用于整型操作数(char ,short,int ,long) 运算规则: 1)& 按位与 全1才1 否则0 : 只有对应的两个二进位均为1时,结果位才为1,否则为0 用6和3这个例子. #include <stdio.h> int main(int argc, const char * argv[]) { //定义两个整型变量,分别对其做按位与.按

C语言的位运算的优势

位运算加速技巧1. 如果乘上一个2的倍数数值,可以改用左移运算(Left Shift) 加速 300% x = x * 2;x = x * 64;//改为:x = x << 1; // 2 = 21x = x << 6; // 64 = 26 2. 如果除上一个 2 的倍数数值,可以改用右移运算加速 350% x = x / 2;x = x / 64;//改为: x = x >> 1;// 2 = 21x = x >> 6;// 64 = 26 3. 数值转

【学习笔记】【C语言】位运算

1. & 按位与 1> 功能 只有对应的两个二进位均为1时,结果位才为1,否则为0. 2> 举例: 比如9&5,其实就是1001&101=1,因此9&5=1 3> 规律 二进制中,与1相&就保持原位,与0相&就为0 2. | 按位或 1> 功能 只要对应的二个二进位有一个为1时,结果位就为1,否则为0. 2> 举例: 比如9|5,其实就是1001|101=1101,因此9|5=13 3. ^ 按位异或 1> 功能 当对应的

巧用位运算

1.用一个表达式,判断一个数X是否是2的N次方(2,4,8,16.....),不可用循环语句. 解析:X:2,4,8,16转化成二进制是10,100,1000,10000.如果减1则变成01,011,0111,01111.两者做按位与运算,结果如果为0,则X是2的N次方. 答案:!(X&(X-1)) 2.统计一个整数的二进制中1的个数 int CountNumberOfOne(int number) { int counter = 0; while (number) { number &=

c语言位运算详解

位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型. C语言提供的位运算符列表: 运算符含义描述 & 按位与      如果两个相应的二进制位都为1,则该位的结果值为1,否则为0 | 按位或      两个相应的二进制位中只要有一个为1,该位的结果值为1 ^ 按位异或    若参加运算的两个二进制位值相同则为0,否则为1 ~ 取反        ~

C语言位运算

在计算机程序中,数据的位是可以操作的最小数据单位,理论上可以用“位运算”来完成所有的运算和操作.一般的位操作是用来控制硬件的,或者做数据变换使用,但是,灵活的位操作可以有效地提高程序运行的效率.C语言提供了位运算的功能, 这使得C语言也能像汇编语言一样用来编写系统程序. 位运算符C语言提供了六种位运算符: & 按位与 | 按位或 ^ 按位异或 ~ 取反 << 左移 >> 右移 位运算 1.位与&