C语言程序设计 王娟勤 西安电子科技大学出版社
ISBN-9787560636702
自建索引, 仅供参考, 以备后查
九、位运算
C语言提供6种基本位运算功能:位取反(单目运算)、位与、位或、位异或、位左移和位右移。
(1)位运算只能是 整型(int) 或 字符型(char),不能为实数型数据。
(2)位运算是对运算量的每一个 二进制位 分别进行操作。
位与:同为 1 时结果才为 1。可用来保留特定位 7 : 0111 (若3个1从右向左代表可读、可写、可执行),则检查是否可执行时 &4 : 0100 -------------- = 4 : 0100 > 0 此时值>0,时可执行 |
|||
0 & 0 = 0 | 0 & 1 = 0 | 1 & 0 = 0 | 1 & 1 = 1 |
位或:存在 1 时结果就为 1。可用来设置指定位为1 1 : 0001 各二进制位意义同上,仅只读,若加入可执行则 | 4 : 0100 -------------- = 5 : 0101 此时拥有 可读和可执行权限 |
|||
0 | 0 = 0 | 0 | 1 = 1 | 1 | 0 = 1 | 1 | 1 = 1 |
位异或:相等时结果为 0 ,不同时为 1。可用作加密,加密解密异或同一字符 86 : 0101 0110 ^31 : 0001 1111 -------------------------- 73 : 0100 1001 |
|||
0 ^ 0 = 0 | 0 ^ 1 = 1 | 1 ^ 0 = 1 | 1 ^ 1 = 0 |
位取反:1 变 0 ,0 变 1。 注意数据长度,如int是32位,高位所有零全变1了,即正变负,负变正。 ~7 (0000 0000 0000 0111) = -8 (1111 1111 1111 1000) |
|||
~0 = 1 | ~1 = 0 |
/// C 语言实现:无需临时变量,交换两数的值
#include <stdio.h>
void main()
{
int a = 3;
int b = 4;
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("a = %d, b = %d", a, b);
}
/// Java 语言实现:无需临时变量,交换两数的值
@Test
public void swapIntegersWithoutAnotherVariable() {
int a = 3, b = 4;
System.out.format("a = %d, b = %d %n", a, b);
/// do swap ///
a = a ^ b;
b = a ^ b;
a = a ^ b;
System.out.println("------------------");
System.out.format("a = %d, b = %d %n",