源码一位运算
发布时间: 2022-05-10 16:49:40
A. java中的这几个位运算符有大神讲解一下不最好举生活中的例子,谢谢!
/**
我通俗点说:在位运算里面,其实大多数都是进行二进制运算的,也就是0和1,之间的运算!
以下例子里面:0代表假,1代表真;
按位与:&
真与真=真;(1&1=1)
假与假=假;(0&0=0)
真与假=假;(1&0=0)
假与真=假;(0&1=0)
总结(在按位与里面,逢假(0)必假(0));
-----------------------------------------------------------------
按位或:|
真与真=真;(1|1=1)
假与假=假;(0|0=0)
真与假=假;(1|0=1)
假与真=假;(0|1=1)
总结(在按位或里面,逢真(1)必真(1));
-----------------------------------------------------------------
按位异或:^
真与真=真;(1^1=0)
假与假=假;(0^0=0)
真与假=假;(1^0=1)
假与真=假;(0^1=1)
总结(在按位或里面,相同就(0)不同则(1));
----------------------------------------------------------------
按位非~
这个我思前想后了很久,我觉得我不好更通俗的讲解;
(请原谅,我尽可能的保持通俗)
我要是跟你讲这个,你需要了解一点基本知识,才比较好理解一点!
你了解这个:(源码--反码---补码),我比较好讲一点!
a:所有字面值常量(你暂时理解基本数字):他们在内存里面存储的时候,都是以二进制的补码形式存在的!
b:不管正数还是负数,在内存里面存储都是补码!
c:不同点就是:正数的源码,反码,补码,都一样!
d:负数则不一样,一个负数的补码,是该正数的源码--->逐位取反--->然后末尾+1--->得到的就是该负数在内存里面存储的形式(补码)!
e:正数的最高位,即(最左边第一位是0,其他位有效值位),负数的最高位,即(最左边第一位是1,其他位是有效数值位!)
好了,基本知识我说完了,不好意思我只有这能力了,能不能看懂完全看造化了!
--->>进入主题:
按位非,是一元运算符:
它的作用是一把个数字的补码,逐位取反,得到另外一个数字的补码!这个我觉得需要举例比较容易理解一点:
例子:假如(非5:~5),因为5是正数,所以5的二进制在内存里面形式都一样,举短一点的吧,byte类型,8位!
00000101<<---5的二进制;
11111010<<---按位非~,0变1,1变0(变完以后,这个是另外一个数字的补码,因为是负数,我们不好看,但是我们可以还原他的正数,就知道该数是几了!)
00000100<<---按照上面d步骤逆向过来,末尾-1--->>逐位取反--->>得到该数正数的原码!
所以你看这个数字有效位是4;所以,上面的那个负数补码就是-4,总结(~5=-4);
我天,我都尽可能说详细了...还是觉得怕你看不明白!
--------------------------------------------------------------------------------
左移:<<(理解是乘法,2的n次幂,2是底数!)--->>低位补零
5<<2=20等价5x(2x2)=20
6<<3=48等价6x(2x2x2)=48
4<<4=64等价4x(2x2x2x2)=64
右移:>>(理解是除法,倍率同上)---->>如果是正数,在高位补零,如果是负数,则在高位补1
8>>2=2等价8÷(2x2)=2;
16>>3=2等价16÷(2x2x2)=2;
-16>>3=-2等价-16÷(2x2x2)=-2;
无符号右移>>>(和右移是一回事,区别在后面)--->不管正负数:高位都是补0;
16>>3=2等价16÷(2x2x2)=2;
-16>>3=-2等价16÷(2x2x2)=2;
(不管正负还是负数,结果都是正数,懂了?这就是无符号右移的区别!)
-------------------------------------------------------------------------------
这些知识都是非常基础的知识,很关键,也很重要,如果我说的你看不懂,也没关系,你可以跳过这一步,向后面学习
学一段时间后,在回头看看..会恍然大悟的!!
不好意思解答能力有限:不足之处还请路人..指点!!
*/
B. C语言编程输入一个整数求原码,要用位运算来进行编程
#include<stdio.h>
#include<limits.h>
char*to_binary_str(char*buffer,intvalue)
{
inti;
for(i=sizeof(int)*8-1;i>-1;i--)
buffer[31-i]=((value>>i)&1)+'0';
buffer[sizeof(int)*8]='