网上很多帖子都有关于位运算的总结,所以自己准备用自己的理解来写有关位运算的知识,还请各位指
出错误之处。
简单来说,位就是1 和0 ,在电脑中做的每一件事都是由它们组成的。电脑中所有的数据使用的是位。
一个字节由8 个位组成;一个字由两个字节组成,即16个位;而一个双字由四个字节组成,即32个
位。由于位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快
位运算有哪些操作符?
& ,| ,~,<<,>>,^
( 补充,逻辑运算符是 || , && , !这些和位运算符大大不同)
它们分别的意思是:
& 与运算符 | 或运算符 ~ 取反运算符 >> 右移运算符 << 左移运算符 ^ 异或运算符
下面我们看看这些操作符是怎么操作的:
& :
1.运算规则:有0变0 ,无0 为1
2.判断奇偶性
a&1 = 0 偶数
a&1 = 1 奇数
3.可以用来取位操作
4.判断一个数的二进制第n 位是否为1 的方法是:把一个n 位为1 ,其它位为0 与待判断的数进行与运算
我们看下例子(看是否存在D 盘,主要是根据与运算是否存在1000):
5.求余优化(x%(2n)=x&(2n - 1))
| :
1.运算规则:有1变1 ,无1 变0
2.一个数or 1的结果就是把二进制最末位强行变成1
~:
1.取反运算的定义是把内存中的0 和1 全部取反。使用not 运算时要格外小心,你需要注意整数类型有没有符号。如果not的对象
是无符号整数(不能表示负数)。
如:
如上面的一段程序 算出来为 65435 而它的上界位65536 所以算出来的结果是它们的差,因为无符号类型的数是用$0000到$
FFFF依次表示的。
<<:(左移)
1.如A<<B:是A 转换为二进制后向左移动B 位
2.左移3 相当于乘以2 的3 次方
可以使用(1 << 16 )-1 来表示个常量 如# defien Max_N (1 << 16 ) - 1, 因为这个值表示65535(很有用,有时大量的乘除
运算可用移位代替,效率会很高!)
>>:(右移)
1.A>>B:是A 转换为二进制后向右移动B 位
2.右边的位被挤掉。对于左边移出的空位,如果是正数则空位补0 ,若为负数,可能补0 或补1 ,这取决于所用的计算机系统。
Code:
1. DWORD d = GetLogicalDrives();
2. if((d&8)>0) //是否存在D 盘
3. {
4. SetDlgItemText(hwnd,IDC_EDTNAME4,TEXT( " 存在D盘" ));
5. }
6. else
7. {
8. SetDlgItemText(hwnd,IDC_EDTNAME4,TEXT( " 不存在D 盘" ));
9. }
Code:
1. #include <stdio.h>
2. int main(void)
3. {
4. unsigned short a=100;
5. a = ~a;
6. printf( "%d\n", a );
7. return 0;
8. }
下面是个例子,看电脑中存在多少磁盘(主要是右移!)
^:(异或)
1.可以用一句话理解:是不是不一样 (不一样为1 ,一样为0 )
2.两次异或同一个数还是它本身(如:( a ^b)^b=a )
3.(a ^ b) ^ b = a,像这种异或运算可用于加密 用两次异或 b 位密码
一些位运算的例子:
用位运算求绝对值:
x >> 31 是二进制的最高位,它用来表示x 的符号。如果它为0(x 为正),则~ (x >> 31) + 1 等于$ 00000000,异或任何
数结果都不变;如果最高位为1 (x 为负),则~ (x >> 31) + 1 等于$ FFFFFFFF ,x 异或它相当于所有数位取反,异或完后再
加一。
出错误之处。
(ps:用到的语言:C )
简单来说,位就是1 和0 ,在电脑中做的每一件事都是由它们组成的。电脑中所有的数据使用的是位。
一个字节由8 个位组成;一个字由两个字节组成,即16个位;而一个双字由四个字节组成,即32个
位。由于位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快
位运算有哪些操作符?
& ,| ,~,<<,>>,^
( 补充,逻辑运算符是 || , && , !这些和位运算符大大不同)
它们分别的意思是:
& 与运算符 | 或运算符 ~ 取反运算符 >> 右移运算符 << 左移运算符 ^ 异或运算符
下面我们看看这些操作符是怎么操作的:
& :
1.运算规则:有0变0 ,无0 为1
2.判断奇偶性
a&1 = 0 偶数
a&1 = 1 奇数
3.可以用来取位操作
4.判断一个数的二进制第n 位是否为1 的方法是:把一个n 位为1 ,其它位为0 与待判断的数进行与运算
我们看下例子(看是否存在D 盘,主要是根据与运算是否存在1000):
5.求余优化(x%(2n)=x&(2n - 1))
| :
1.运算规则:有1变1 ,无1 变0
2.一个数or 1的结果就是把二进制最末位强行变成1
~:
1.取反运算的定义是把内存中的0 和1 全部取反。使用not 运算时要格外小心,你需要注意整数类型有没有符号。如果not的对象
是无符号整数(不能表示负数)。
如:
如上面的一段程序 算出来为 65435 而它的上界位65536 所以算出来的结果是它们的差,因为无符号类型的数是用$0000到$
FFFF依次表示的。
<<:(左移)
1.如A<<B:是A 转换为二进制后向左移动B 位
2.左移3 相当于乘以2 的3 次方
可以使用(1 << 16 )-1 来表示个常量 如# defien Max_N (1 << 16 ) - 1, 因为这个值表示65535(很有用,有时大量的乘除
运算可用移位代替,效率会很高!)
>>:(右移)
1.A>>B:是A 转换为二进制后向右移动B 位
2.右边的位被挤掉。对于左边移出的空位,如果是正数则空位补0 ,若为负数,可能补0 或补1 ,这取决于所用的计算机系统。
Code:
1. DWORD d = GetLogicalDrives();
2. if((d&8)>0) //是否存在D 盘
3. {
4. SetDlgItemText(hwnd,IDC_EDTNAME4,TEXT( " 存在D盘" ));
5. }
6. else
7. {
8. SetDlgItemText(hwnd,IDC_EDTNAME4,TEXT( " 不存在D 盘" ));
9. }
Code:
1. #include <stdio.h>
2. int main(void)
3. {
4. unsigned short a=100;
5. a = ~a;
6. printf( "%d\n", a );
7. return 0;
8. }
下面是个例子,看电脑中存在多少磁盘(主要是右移!)
^:(异或)
1.可以用一句话理解:是不是不一样 (不一样为1 ,一样为0 )
2.两次异或同一个数还是它本身(如:( a ^b)^b=a )
3.(a ^ b) ^ b = a,像这种异或运算可用于加密 用两次异或 b 位密码
4.另外还有一个是不引入第三变量,交换两个变量的值 (设 a=a1,b=b1) ->
一些位运算的例子:
用位运算求绝对值:
x >> 31 是二进制的最高位,它用来表示x 的符号。如果它为0(x 为正),则~ (x >> 31) + 1 等于$ 00000000,异或任何
数结果都不变;如果最高位为1 (x 为负),则~ (x >> 31) + 1 等于$ FFFFFFFF ,x 异或它相当于所有数位取反,异或完后再
加一。
2078

被折叠的 条评论
为什么被折叠?



