源碼一位運算
發布時間: 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]='