C语言的位运算的优势

位运算加速技巧
1. 如果乘上一个2的倍数数值,可以改用左移运算(Left Shift) 加速 300%

x = x * 2;
x = x * 64;
//改为:
x = x << 1; // 2 = 21
x = x << 6; // 64 = 26

2. 如果除上一个 2 的倍数数值,可以改用右移运算加速 350%

x = x / 2;
x = x / 64;
//改为:

x = x >> 1;// 2 = 21
x = x >> 6;// 64 = 26

3. 数值转整数加速 10%

x = int(1.232)
//改为:

x = 1.232 >> 0;

4. 交换两个数值(swap),使用 XOR 可以加速20%

var t:int = a;
a = b;
b = t;
//equals:
a = a^b;
b = a^b;
a = a^b;

5. 正负号转换,可以加入 300%

i = -i;
//改为
i = ~i + 1; // NOT 写法
//或
i = (i ^ -1) + 1; // XOR 写法

6. 取余数,如果除数为 2 的倍数,可利用 AND 运算加速 600%

x = 131 % 4;
//equals:
x = 131 & (4 - 1);

7. 利用 AND 运算检查整数是否为 2 的倍数,可以加速 600%

isEven = (i % 2) == 0;
//equals:
isEven = (i & 1) == 0;

8. 加速 Math.abs 600% 的写法1,写法2 又比写法1加速 20%

//写法1
i = x < 0 ? -x : x;

//写法2

i = (x ^ (x >> 31)) - (x >> 31);

//写法3

i=x^(~(x>>31)+1)+(x>>31);

9. 比较两数值相乘之后是否拥有相同的符号,加速 35%

eqSign = a * b > 0;
//equals:
eqSign = a ^ b > 0;

其它位运算技巧
1. RGB 色彩分离

var 24bitColor:uint = 0xff00cc;
var r:uint = 24bitColor >> 16;
var g:uint = 24bitColor >> 8 & 0xFF;
var b:uint = 24bitColor & 0xFF;

2. RGB 色彩合并

var r:uint = 0xff;
var g:uint = 0x00;
var b:uint = 0xcc;
var 24bitColor:uint = r << 16 | g << 8 | b;

ps——尤其是在嵌入式中,位运算尤为重要!

时间: 2024-10-07 05:26:19

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语言之位运算

位运算 1).定义. 指的是1个二进制数据的每一位来参与运算. 位运算的前提: 是这个数必须是1个二进制. 注意: a). 参与位运算的二进制数据必须是补码形式. b). 位运算的结果也是二进制的补码形式. 2).按位与: & 参与按位与的两个二进制数.如果都为1 那么结果就为1 只要有1位为0 那么结果就为0. 3 & 2; 第1步骤:先得到两个数的二进制补码形式. 3的补码: 00000000 00000000 00000000 00000011 2的补码: 00000000 0000

嵌入式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. & 按位与 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> 功能 当对应的

[C++] 位运算

负数的存储 首先需要知道的是整数在计算机中的存储. 正数和0就不用多说了,就是二进制原码.问题在于负数. 负数在计算机中以二进制补码的形式存储.补码是反码 + 1: 7的二进制是 0111 .-7的二进制是多少呢? 以8位为例,-7的原码是 1000 0111,其中首位的1是符号位,表示负数的意思.在取反是符号位是不参与的.反码是 1111 1000: 补码是反码+1 : 1111 1001. 位运算的优势在于速度快.还有就是大神们都是用位操作的... 但是位操作的优先级是最低的,因此在使用时注

巧用位运算

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 ~ 取反        ~