程序中的所有数量都以二进制形式存储在计算机内存中。 位操作是编程中的位模式或二进制的一项和二元操作。 在许多旧的微处理器中,位运算比加减运算快一些,而普通位运算比乘除运算快很多。 在现代体系结构中,情况并非如此。 位运算的运算速度通常与加法运算相同。 比乘法还快。 (摘自维基百科)
运算对CPU友好,是程序的优化手段,也是大型制造商面试时经常提到的话题。 在日常编程中用于运算也可以实现很多有趣的事情。 作为计算机相关专业的毕业生,至今没有使用过比特运算,真是耻辱。 于是最近恶补了相关知识,在这里简要记录。
比特运算符包括反转、逐比特或逐比特异或、逐比特和; 对于比特,也可以进行移位、左移运算、左移操作、高位比特舍弃、低位比特补充0; 右移位运算、右移位操作、无符号数、对高位比特为0、有符号数、对高位比特补充符号比特。
已知在C/C中,一个char型变量在存储器中占一个字节,即8个比特,实际上各个比特可以被用作开关以生成标志比特等。
基本位运算符
介绍位运算符的操作。 如果and运算的两个位都为1,则结果为1。 否则为0。 例如,可能是1 0 0 1 1
1 1 0 0 1
-------------请参阅
如果1 0 0 0 1|或运算的两个位都为0,则结果为0,否则为1。 例如,1 0 0 1 1
| 1 1 0 0 1
-------------请参阅
1 1 0 1 1^异或运算,如果两个位相同则为0,如果不同则为1,例如1 0 0 1 1
^ 1 1 0 0 1
-------------请参阅
反算00010~,0等于1,1等于0。 例如~ 1 0 0 1 1
-------------请参阅
0 1 1 0 0左移运算、左移操作、舍弃高位、低位补充0,例如int a=8;
a 3;
班次前: 000000000000000000000000000000000000000000000000
移位后: 000000000000000000001000000右移位运算、右移位操作、无符号数、高位为0、有符号数、高位为0,例如unsigned int a=8;
a 3;
班次前: 000000000000000000000000000000000000000000000000
班次后: 00000000000000000000000000000000000000000000000001
int a=-8;
a 3;
位移前: 11111111111111111111111111111111111111111000
位移前: 1111111111111111111111111111111111111111111111111111111111111111111111
以上给出了位操作中的基本算子,利用这些基本运算,可以利用二进制的一些性质,实现例如快速乘除、两个数交换、奇偶校验判断、绝对值求解、高低位交换、逆序、高速统计1个数等操作。
以统计二进制中的1个数为例,计算34520进制中的1个数:
计算其a=(a-1 )的结果。 第一次:计算前: 1000 0110 1101 1000计算后: 1000 0110 1101 0000
第二次:计算前: 1000 0110 1101 0000计算后: 1000 0110 1100 0000
第二次:计算前: 1000 0110 1100 0000计算后: 1000 0110 1000 0000
因为很容易看到每次计算二进制文件时都会减少一个1,所以可以使用count=0的方法进行统计
wile(a ) {
a=a(a-1 );
出局;
}
很容易看出,通过活用位运算,运算效率大幅提高。 由于存储在计算机中进行处理的是二进制,因此位运算也很符合计算机的处理逻辑。
逐位反转
除以上计算外,还有按位逆计算。 以下简要记录。
在进行逐位翻转之前,必须首先了解原始代码、完成代码、翻转代码和翻转代码。 原代码:正数是其二进制本身;
负数是符号位为1、数值部分取x的绝对值的二进制数。
反符号:正反符号与原符号相同
负数的符号比特为1,其他比特的原符号相反。
补数)正补数与原码、反码相同;
负数的符号比特为1,其他比特的原符号反转,未比特加1。 (反相末尾减去1 ),或者负数的补数是其绝对值反相的位数加上1 ) ) ) ) )。
反过来说,简单的0等于1,1等于0
要按位取,必须涉及上述概念。 要理解这个运算符的计算方法,首先要理解存储器中存储了二进制数,二进制数作为补码存储在存储器中。
以计算正数9的每位反转为例,计算步骤如下。 (注:前4位为符号位(-原符号: 0000 1001
-计算反符号:0000 1001 (与正反符号相同的原符号) )
-补数:0000 1001 (与正补数相反的符号) () ) ) ) ) ) ) ) ) ) ) ) )
-弥补反: 1111 0110 (满位0为1,1为0 )
-倒数: 1111 0101 (末位负1 ) ) ) ) ) ) ) )。
-计算源代码: 1111 1010 (其他位相反) () ) ) ) ) ) ) ) 65 () ) )
总结规律,(~x=-(x1 ) ) ) ) ) ) ) ) )。
对位取反的总结到此结束,但关于位取反的用途,现在博客的知识有限,欢迎补充。
逐位反转和反转的区别:在c语言中
! 表示逻辑相反。 也就是说,将所有非0的数值(相当于1 )设为0,将0设为1。
~表示按位反转。 也就是说,在数字二进制表示中,将0设为1,将1设为0。
参考文献
-----------------
Author: Frytea
Title:计算机基础的位运算|逐位反转
link :https://blog.fry tea.com/archives/424 /
版权所有3360 thisworkbytl-songislicensedunderacreativecommonsattribution-non commercial-share alike 4.0国际许可证