当前位置:首页 » 操作系统 » 源码一位运算

源码一位运算

发布时间: 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]='';

returnbuffer;
}

intmain(void)
{
charbuffer[33];
intn;

scanf("%d",&n);

if(n>=0){
printf("反码:%s ",to_binary_str(buffer,n));
printf("补码:%s ",to_binary_str(buffer,n));
printf("原码:%s ",to_binary_str(buffer,n));
}else{
if(n==INT_MIN)
printf("反码:1%s ",to_binary_str(buffer,~n));
else
printf("反码:%s ",to_binary_str(buffer,n-1));
printf("补码:%s ",to_binary_str(buffer,n));
if(n==INT_MIN)
printf("原码:1%s ",to_binary_str(buffer,n));
else
printf("原码:%s ",to_binary_str(buffer,~n+1|INT_MIN));
}
return0;
}

C. 参与位运算的到底是补码还是原码

补码是相对有符号数来说的,有符号数进行位运算的都是补码,只不过正数的补码是他本身,所以你看到的9和5的补码就是他的原码,只有负数的才不一样

D. C语言位运算问题

1、假设一个数用8为来存储,最高位表示符号(0表示正,1表示负)。那么12的二进制源码就是00001100,-10的二进制源码就是10001010
2、正数源码、反码、补码都一样;负数的反码是除最高位外,其余位都取反,反码加1就是补码。
如12的源码、反码、补码均是00001100,-10的源码是10001010,反码是11110101(最高位不取反),补码是11110110。
3、负数在是以补码的形势存储,所以位运算是对反码进行操作(有的书说正数是对源码操作,但是正数源码、反码、补码都一样,为了照顾负数,我是认为对补码操作的)
4、&运算,只有对应的两个二进位均为1时,结果位才为1 ,否则为0。
所以a&b=00000100(补码),转化为源码00000100,十进制c=4
5、|运算,只要对应的二个二进位有一个为1时,结果位就为1。
所以a|b=11111110(补码)—>11111101(补码)—>10000010(源码),十进制d=-2
6、^运算,当两对应的二进位相异时,结果为1。
所以a^b=11111010(补码)—>11111001(反码)—>10000110(源码),十进制e=-6
7、左移、右移难表述,用12演示一下
00001100左移两位后{(00)001100}00,{}内的是未左移的,由于以8位存储,所以()内的就不要了,计算数值时以00110000计算,明显f=48,g=3
9、~运算,对参与运算的数的各二进位按位求反。
所以~b=00001001,h=9

E. C++中,用位运算完成进制之间的转换,求源码

#include<iostream>
usingnamespacestd;

intmain()
{
//转二进制
intn,a=0;
cin>>n;
while(n)
{
a=n&1;
n=n>>1;
cout<<a;
}

//转八进制
while(n)
{
a=n&7;
n=n>>3;
cout<<a;
}

//转十六进制
while(n)
{
a=n&15;
n=n>>4;
if(a<10)cout<<a;
elsecout<<'A'+(a%10);
}

return0;
}

另外,输出的时候应该是反过来输出才对。至于如何反过来输出,你自己考虑。我只提供一个思路给你。

F. C语言原码补码按位运算问题!

int类型一般是16位,比如1就是0000 0000 0000 0001,其中有符号数第一位是符号位,正是0,负是1;
-20转换为二进制按规则应该是 1000 0000 0001 0100;这个就是原码,但是计算机中不是这么存储的;
然后将符号位以外的这15位取反,得到,1111 1111 1110 1011;这个叫反码
之后再加上1,得到,1111 1111 1110 1100;这个是补码(计算机中存储的-20)
从一个二进制数反推回十进制,按相反的顺序计算即可.

位运算>>,就是向右位移一定位数,正数补0,负数补1;
所以-20>>3就是111 1111 1111 1110 1(左边补出3个1,右边的100丢失)
得到1111 1111 1111 1101,这个是补码,(计算机中的数)
减1得1111 1111 1111 1100,这个是反码;
取反得1000 0000 0000 0011,这个是原码;(方便我们识别的数)
也就是十进制的-3.

G. 如何进行位运算什么时候用原码,什么时候又用补码

位运算符有以下几种: ^按位异或运算 |按位或运算 &按位与运算 ~按位取反运算 >>位左移操作 <<位右移操作.

在单片机等嵌入式系统中,位运算是十分常用的运算之一.

而在PC上写应用程序时,位运算符用得比较少,只有在需要构造一些特殊的数时或者一些编解码等时可能用到.

例如对于一个整数x,如果要把它的每个位都置1,那么可以写x=~0; /*每位都是0取反就是全1了*/
这样写的好处是,可以不管这个整数x是多少位的,编译器会自动生成合适的数.

另一个常用的操作是用&来获取某个或者某些位.例如获取整数x中的低4位可以写成x&0x0F

也可以用|,&,<<,>>等配合来设置和清除某位或者某些位.

例如: x=x&0x1; /*清除x的最后一位,即第0位*/
x=x&(0x1<<5); /*清除x的低5位*/
x=x|0x1; /*将x的最后一位(即第0位)设置为1*/
x=x|(0x1<<6); /*将x的第6位设置为1*/

看看这个实际问题,在里面使用了位运算操作:http://..com/question/17447875.html

H. 关于JAVA的位运算

~是取反运算

首先,你要知道java中的int是32位的
其次,正数以原码的形式存储,负数以补码的形式存储
4的二进制是0000 0000 0000 0000 0000 0000 0000 0100

取反后得1111 1111 1111 1111 1111 1111 1111 1011

java中都是有符号数,首位是1,所以是负数,负数也就是补码,也就是说
1111 1111 1111 1111 1111 1111 1111 1011是补码
补码,反码加1后得源码
转换成源码得0000 0000 0000 0000 0000 0000 0000 0101
这个数是5,加上符号就是-5

I. 对于原码,补码,反码的“算术左移/右移,逻辑左移/右移”是不是都按同样的方法操作

原码、补码、反码最终都要表示成二进制形式,可以看成是三个独立的二进制数,再对这三个数分别进行指定的移位操作。
如果一定要说有一个统一的码,这个码就是二进制码。

J. C语言,位运算问题

#include "stdafx.h"
#include <stdio.h>
main()
{
unsigned short bu_ma(unsigned short x);
unsigned short n;

scanf("%x",&n);
printf("%x(%d)",bu_ma(n),(short)bu_ma(n));
}

unsigned short bu_ma(unsigned short x)
{ unsigned short a,temp1=(unsigned short)(~0)^((unsigned short)(~0)>>1),temp2=(unsigned short)(~0)>>1;

if(x&temp1)/*如果最高位是1*/
/*负数的补码 */
{
a=x&temp2;/*求绝对值 */
a=~a+1;/*取反、加1*/
return(a);
}
else/*正数的补码 */
return(x);
}
改过了,输入是十六进制,输出同样是十六进制(括号中给出十进制带符号表示)

热点内容
python写入字节 发布:2024-10-09 01:24:22 浏览:645
如何设置超高难度密码 发布:2024-10-09 01:19:05 浏览:176
linux只读文件修改 发布:2024-10-09 01:13:08 浏览:83
安卓机电脑用什么检测 发布:2024-10-09 01:10:20 浏览:670
有关数据库的工作 发布:2024-10-09 00:52:12 浏览:732
代码分析算法 发布:2024-10-09 00:47:11 浏览:161
芯片写程序需要配置哪些文件 发布:2024-10-09 00:38:39 浏览:934
存储储存搬运 发布:2024-10-09 00:28:42 浏览:717
吃鸡电脑适合什么配置 发布:2024-10-09 00:18:24 浏览:229
java线程实例 发布:2024-10-09 00:05:34 浏览:193