位(bit)运算
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了位(bit)运算相关的知识,希望对你有一定的参考价值。
参考技术A 一、二进制:所谓二进制就是逢二进一 (0,1), 因为使用二进制只有 0, 1 两个数,简单,易于电子方式实现 , 同时,通过0,1 组合可以表示任意一个数.
二进制有三个重要的概念:
1.原码
用二进制来表示一个数,这个码就是原码.
1 ------> 原码 00000000 0000000 0000000 00000101 = 1 2的零次方+0 2的一次方+1* 2的二次方=1+0+4=5
2.负数的反码=它的原码符号位不变,其它位取反(0->1,1->0)
反码(正数的反码和它的原码一样 , 负数反码 是 符号位不变其它位取反)
补码(正数的补码和它的原码一样,负数的补码是 它的反码+1)
举例
-1
-1的原码 10000000 00000000 00000000 00000001
-1的反码 11111111 11111111 11111111 11111110
-1 的补码 11111111 11111111 111111111 11111111
3. 在计算机运算的时候,都是以补码的方式来运算的
4+5=>计算机 4-5=4+(-5)
这句话意思就是,不管一个数是正数还是负数,都要被转成补码,然后进行运算.
位运算一览表:
该图的前面四个是位运算
其运算规则是:
按位与& : 两位全为1,结果为1
按位或| : 两位有一个为1,结果为1
按位异或 ^ : 两位一个为0,一个为1,结果为1
按位取反 : 0->1 ,1->0
<h3>求解:~2=?</h3>
步骤 : 首先要求出 2的补码
2是正数 所以 原码=反码=补码
2 原码
00000000 00000000 00000000 00000010
~2
11111111 11111111 11111111 11111101 (补码)->原码
? 负数的 原码-》反码-》补码
11111111 11111111 11111111 11111101->
推出其反码 (对补码-1)
11111111 11111111 11111111 11111100
推出原码
10000000 00000000 00000000 0000011 -> -3
~-5=?
-5 的 补码找出来.
-5 原码 10000000 00000000 00000000 00000101
-5 反码 11111111 11111111 11111111 11111010
-5 补码 11111111 11111111 11111111 11111011
~-5取反 00000000 00000000 00000000 00000100 (补码)
4
3 的补码 00000000 00000000 00000000 00000011
2&3 00000000 00000000 00000000 00000010 [补码]
2 的补码 00000000 00000000 00000000 00000010
3 的补码 00000000 00000000 00000000 00000011
2^3 00000000 00000000 00000000 00000001
二:位移运算:在php 中位运算有两种 >> (右移) << (左移)
运算的规则是 :
算术右移:低位溢出,符号位不变,并用符号位补溢出的高位
算术左移: 符号位不变,低位补0
根据我们前面的规范,来完成几个案例
$a=1>>2;
1 的补码
00000000 00000000 00000000 00000001
1>>2
00000000 00000000 00000000 00000000
$b=-1>>2;
$c=1<<2;
1<<2
1的补码
00000000 00000000 00000000 00000001
00000000 00000000 00000000 00000100
c语言中按位逻辑运算符位移运算符
c语言中按位逻辑运算符、位移运算符
#include <stdio.h>
int count_bits(unsigned x)
{
int bits = 0;
while(x)
{
if(x & 1U)
bits++;
x >>= 1;
}
return bits;
}
int int_bits(void)
{
return count_bits(~0U);
}
int print_bits(unsigned x)
{
int i;
for(i = int_bits() - 1; i >= 0; i--)
{
putchar(((x >> i) & 1U) ? \'1\' : \'0\');
}
putchar(\'\\n\');
}
int main(void)
{
unsigned a, b;
puts("please input two unsigned integers.");
printf("unsigned a = "); scanf("%u", &a);
printf("move unit = "); scanf("%u", &b);
printf("\\nbinary a = "); print_bits(a);
printf("right move = "); print_bits(a >> b);
printf("left move = "); print_bits(a << b);
return 0;
}
以上是关于位(bit)运算的主要内容,如果未能解决你的问题,请参考以下文章