當前位置:首頁 » 操作系統 » 源碼一位運算

源碼一位運算

發布時間: 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);
}
改過了,輸入是十六進制,輸出同樣是十六進制(括弧中給出十進制帶符號表示)

熱點內容
死歌腳本 發布:2024-10-09 03:11:55 瀏覽:85
企業內網搭建電影伺服器侵權嗎 發布:2024-10-09 03:07:14 瀏覽:105
python讀取jpg 發布:2024-10-09 02:50:22 瀏覽:154
王者榮耀的伺服器ip在哪 發布:2024-10-09 02:44:48 瀏覽:77
安卓怎麼下載李寧 發布:2024-10-09 02:31:37 瀏覽:343
配置不高pr哪個版本最好用 發布:2024-10-09 01:57:15 瀏覽:789
編譯OpenWrtipv6 發布:2024-10-09 01:51:40 瀏覽:124
python寫入位元組 發布:2024-10-09 01:24:22 瀏覽:650
如何設置超高難度密碼 發布:2024-10-09 01:19:05 瀏覽:179
linux只讀文件修改 發布:2024-10-09 01:13:08 瀏覽:87