user-0 提问: C语言中位运算符&和|是怎么运算的   

回复:
user: user-1
content: 位运算，需先转换为二进制，然后再进行运算. &(按位与) ： 按位取与可以将两个数之间，只有一个为1的位数据清零  |(按位或) ：  当两个位都为0，结果位0，否则为1； 详见http://www.maomao365.com/?p=2720

user: user-2
content: 学一下进制之间的转换。如：十进制转换为二进制.

user: user-3
content: 位运算，百度一下，有很多资料的

user: user-4
content: 位运算。 &是与。 |是或。 详情百度。

user: user-5
content: 不要把时间浪费在看十进制和知道十进制结果上。务必记住，数字在电脑里存储是二进制，位运算 &、|、~ 也是二进制。看二进制时，就忘掉十进制吧。HEX        BIN                              DEC 0x00000001 00000000000000000000000000000001 1 0x00000002 00000000000000000000000000000010 2 0x00000004 00000000000000000000000000000100 4 0x00000008 00000000000000000000000000001000 8 0x00000010 00000000000000000000000000010000 16 0x00000020 00000000000000000000000000100000 32 0x00000040 00000000000000000000000001000000 64 0x00000080 00000000000000000000000010000000 128 0x00000100 00000000000000000000000100000000 256 0x00000200 00000000000000000000001000000000 512 0x00000400 00000000000000000000010000000000 1024 0x00000800 00000000000000000000100000000000 2048 0x00001000 00000000000000000001000000000000 4096 0x00002000 00000000000000000010000000000000 8192 0x00004000 00000000000000000100000000000000 16384 0x00008000 00000000000000001000000000000000 32768 0x00010000 00000000000000010000000000000000 65536 0x00020000 00000000000000100000000000000000 131072 0x00040000 00000000000001000000000000000000 262144 0x00080000 00000000000010000000000000000000 524288 0x00100000 00000000000100000000000000000000 1048576 0x00200000 00000000001000000000000000000000 2097152 0x00400000 00000000010000000000000000000000 4194304 0x00800000 00000000100000000000000000000000 8388608 0x01000000 00000001000000000000000000000000 16777216 0x02000000 00000010000000000000000000000000 33554432 0x04000000 00000100000000000000000000000000 67108864 0x08000000 00001000000000000000000000000000 134217728 0x10000000 00010000000000000000000000000000 268435456 0x20000000 00100000000000000000000000000000 536870912 0x40000000 01000000000000000000000000000000 1073741824 0x80000000 10000000000000000000000000000000 2147483648布尔运算 (用 1 代表 true，0 代表 false)：与：1 & 1 = 1, 1 & 0 = 0, 0 & 1 = 0, 0 & 0 = 0; 或：1 | 1 = 1, 1 | 0 = 1, 0 | 1 = 1, 0 | 0 = 0; 非：~0 = 1, ~1 = 0;二进制位运算就是把每一个位都按照上述规则计算。以二进制查看一个32位整数，它是由32个0或1的序列组成。如果你将每个位置看作一个开关：0-关，1-开，你就不难理解他的用途了。检测第二位是否存在 (不存在)： 5 & 2 = 0 -- (1 | 4) & 2 = 0 00000000000000000000000000000101 & 00000000000000000000000000000010 = 00000000000000000000000000000000 将第二位置为1 (先前为0)： 5 | 2 = 7 -- (1 | 4) | 2 = (1 | 2 | 4) 00000000000000000000000000000101 | 00000000000000000000000000000010 = 00000000000000000000000000000111 检测第二位是否存在 (存在)： 7 & 2 = 2 -- (1 | 2 | 4) & 2 = 2 00000000000000000000000000000101 & 00000000000000000000000000000010 = 00000000000000000000000000000010 将第二位置为1 (先前为1)： 7 | 2 = 7 -- (1 | 2 | 4) | 2 = (1 | 2 | 4) 00000000000000000000000000000111 | 00000000000000000000000000000010 = 00000000000000000000000000000111 将第二位置为0 (先前为1)： 7 & ~2 = 5 -- (1 | 2 | 4) & ~2 = (1 | 4) 00000000000000000000000000000111 & 11111111111111111111111111111101 = 00000000000000000000000000000101 将第二位置为0 (先前为0)： 5 & ~2 = 5 -- (1 | 4) & ~2 = (1 | 4) 00000000000000000000000000000101 & 11111111111111111111111111111101 = 00000000000000000000000000000101二进制运算的优点就是将某位清零的时候不需要知道之前是1还是0，设置1的时候不需要知道之前是1还是0，可以检测某个位是1还是0。通俗地讲就是用32位二进制数字记录最多32个不同开关的排列组合，并可以检测或设置任意一个开关是否为开或者关。  对于 5 & 2 这样的表达式，你的第一个反应应该是：它是检测 5 中是否包含 2 这个标志位的，而不是关心它的“十进制”结果，没有意义。换算成二进制，一目了然。不过通常，都是将这些二进制常量定义为宏名称这样更直观。如我们在 Windows 编程中非常常见的窗口样式，就是二进制位的一个经典范例：DWORD dwStyle = (DWORD)GetWindowLongPtr(hwnd, GWL_STYLE); if (dwStyle & WS_CHILD) {     dwStyle &= ~(WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX);     dwStyle |= WS_CLIPSIBLINGS;     SetWindowLongPtr(hwnd, GWL_STYLE, (LONG_PTR)dwStyle); }事实上，二进制位在 Windows 编程中无处不在。

user: user-6
content: 位运算，请参考百度

user: user-7
content: 结果是 000

user: user-8
content: 101 010 ----- 000