C语言中位运算符&和|是怎么运算的

houzhiuwei 2015-09-06 03:35:48
比如5&2的值是什么?
...全文
6736 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_25073223 2015-09-21
  • 打赏
  • 举报
回复
位运算,需先转换为二进制,然后再进行运算. &(按位与) : 按位取与可以将两个数之间,只有一个为1的位数据清零 |(按位或) : 当两个位都为0,结果位0,否则为1; 详见http://www.maomao365.com/?p=2720
gh_99 2015-09-15
  • 打赏
  • 举报
回复
学一下进制之间的转换。如:十进制转换为二进制.
qq_21438937 2015-09-13
  • 打赏
  • 举报
回复
位运算,百度一下,有很多资料的
Zidane_2014 2015-09-07
  • 打赏
  • 举报
回复
位运算。 &是与。 |是或。 详情百度。
「已注销」 2015-09-07
  • 打赏
  • 举报
回复 1
不要把时间浪费在看十进制和知道十进制结果上。务必记住,数字在电脑里存储是二进制,位运算 &、|、~ 也是二进制。看二进制时,就忘掉十进制吧。
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 编程中无处不在。
苏叔叔 2015-09-07
  • 打赏
  • 举报
回复
位运算,请参考百度
qq_1813586318 2015-09-07
  • 打赏
  • 举报
回复
结果是 000
赵4老师 2015-09-06
  • 打赏
  • 举报
回复
101 010 ----- 000

69,370

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧