日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

java反码算术运算求和,位运算的妙用,运算妙用

發(fā)布時(shí)間:2024/1/23 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java反码算术运算求和,位运算的妙用,运算妙用 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

位運(yùn)算的妙用,運(yùn)算妙用

最近在學(xué)java,其實(shí)僅僅是在命令行里寫程序跟C語(yǔ)言沒(méi)有太大的區(qū)別,思想都是一樣的。遇到了一個(gè)比較新鮮(后來(lái)知道原來(lái)C中也有)的東西——位元算(又叫位操作)。多新鮮啊,畢向東老師說(shuō)這次(現(xiàn)在正在學(xué)習(xí)的這次)使用位元算符將會(huì)是你們今后使用的唯一的一次,因?yàn)樵陂_發(fā)中根本用不著。其實(shí)也差不多。不過(guò)見到了幾個(gè)應(yīng)用,還是蠻有意思的,這里總結(jié)一下(萬(wàn)一考試就考到了呢,呵呵)。

Java中共有7個(gè)位運(yùn)算符:~(取反)、&(與)、|(或)、^(異或)、>>(右移)、<>>(無(wú)符號(hào)右移)。這里不在解釋位運(yùn)算,只是談?wù)剮追N位運(yùn)算的有趣用法。(不知道位運(yùn)算?看看這里)

加密

1 一個(gè)數(shù)異或同一個(gè)數(shù)兩次還是原數(shù);

2 計(jì)算機(jī)中的文件都是以二進(jìn)制的形式來(lái)存儲(chǔ)的;

利用這兩個(gè)特性,我們就可以用^運(yùn)算來(lái)給文件加密。例如將一個(gè)二進(jìn)制文件中所有的數(shù)據(jù)都異或42這個(gè)數(shù)字,就得到了一個(gè)加密后的文件,“42”就是這個(gè)文件的“鑰匙”。將這個(gè)文件中的所有數(shù)據(jù)再異或42,就完成了“解密”的過(guò)程。

不增加新的變量來(lái)交換a b兩個(gè)變量的值

交換a b兩個(gè)變量的值,幾乎是每一個(gè)人在學(xué)編程的時(shí)候都要接觸的。現(xiàn)在我們想這個(gè)問(wèn)題,我有兩個(gè)瓶子,A瓶裝著果汁,B瓶裝著醋,要是A瓶裝醋,B瓶裝果汁,如何做呢?通常,我們會(huì)用下面這段代碼:

int temp;

temp = a;

a = b;

b = temp;

這就像我們找來(lái)一個(gè)新瓶子C,先將果汁倒入新瓶子,然后醋倒入A,果汁再倒入B。這是很容易想到的辦法。那么如果沒(méi)有別的瓶子了呢?看看這個(gè):

a = a + b; //此時(shí)a包含a 和 b

b = a - b;

a = a - b;

只有兩個(gè)瓶子,那么我們只好把它們倒在一起,然后將混合物中的果汁倒入B。不可思議是嗎?別急,我們將果汁和醋倒在一起的時(shí)候,B瓶還在,這可是程序呀,B瓶仍然裝著醋,這時(shí)我們就可以將(混合-醋)的值給B,也就是果汁,再將(混合-果汁)的值給A,完成!但是,這種方式有一個(gè)弊端:有可能a+b的值會(huì)超出int型的范圍。

基于同樣的想法,我們還可以用一下的代碼:

a = a ^ b;

b = a ^ b; //實(shí)際上是(a^b)^b 也就是a異或了b兩次,等號(hào)右邊是a的值

a = a ^ b; //此時(shí)b里面已經(jīng)是“果汁”,實(shí)際上是(a^b)^a,也就是b異或了a兩次,是b

第一步之后,原來(lái)a占用了多少位依舊是多少位,絕對(duì)不會(huì)發(fā)生數(shù)據(jù)的溢出。

ps:為了程序的可讀性,真正開發(fā)時(shí)要慎用后兩種!

進(jìn)制的轉(zhuǎn)換(10進(jìn)制轉(zhuǎn)16進(jìn)制為例)

接觸位運(yùn)算之前,進(jìn)制轉(zhuǎn)換我是這么操作的:

class turn10_16{

public static void main(String[] args){

int n=200; //n就是代轉(zhuǎn)換的數(shù)字

boolean out_turn=false; //輸出時(shí)用,去掉輸出時(shí)候高位上的‘0’

int[] s=new int[20]; //將轉(zhuǎn)換后的十六進(jìn)制數(shù)存放在s[]數(shù)組中

while(n>0){

int i=0;

s[i]++;

while(s[i]>15){ //逢16進(jìn)一,并且檢查下一位

//是不是16,如果是,再進(jìn)一

s[i]=0;

i++;

s[i]++;

}

n--; //數(shù)完一個(gè)之后n--,知道數(shù)完n個(gè)數(shù)

}

for(int i=19;i>=0;i--){

if(out_turn == false){ //這個(gè)if是為了去掉最高位上的0,

// 其中out_turn作為開關(guān);

if(s[i]==0)

continue;

else{

out_turn=true;

i++;

}

}

else{ //輸出轉(zhuǎn)換之后的結(jié)果,10輸出A,類推

if(s[i]<10)

System.out.print(s[i]);

else

System.out.print((char)('A'+(s[i]-10)));

}

}

System.out.println();

}

}

這種轉(zhuǎn)換就像數(shù)數(shù),一共有多少個(gè),我來(lái)用十六進(jìn)制的方法再數(shù)一遍,逢16進(jìn)1,數(shù)完為止。這種方法的弊端就是效率低,而且不能轉(zhuǎn)換負(fù)數(shù)。

我們知道,10進(jìn)制的數(shù)據(jù)在計(jì)算機(jī)中使用2進(jìn)制來(lái)存儲(chǔ)的,而16進(jìn)制的出現(xiàn)也是為了閱讀性強(qiáng),使4個(gè)位置放在一起計(jì)數(shù)。那么理論上,用“位運(yùn)算”來(lái)操作,效率肯定會(huì)高。

class turn10_16{

public static void main(String[] args){

int n=200; //n就是代轉(zhuǎn)換的數(shù)字

boolean out_turn=false; //輸出時(shí)用,去掉輸出時(shí)候高位上的‘0’

int[] s=new int[20]; //將轉(zhuǎn)換后的十六進(jìn)制數(shù)存放在s[]數(shù)組中

for(int i=0;i<=8;i++){ //int型占用了8個(gè)byte位置,每個(gè)byte即一個(gè)16進(jìn)制,

//每次保留一個(gè)byte并且轉(zhuǎn)換成16進(jìn)制,至少要8次(可以優(yōu)化)

int temp= n & 15; //與0000-0000 0000-0000 0000-0000 0000-1111進(jìn)

// 行&運(yùn)算,只保留最后4個(gè)位置即“個(gè)位”上的數(shù)

s[i]=temp; //將這個(gè)數(shù)賦給個(gè)位

n=n>>>4; //無(wú)符號(hào)右移4個(gè)位置,再保留出十位上的數(shù)

}

for(int i=19;i>=0;i--){

if(out_turn == false){ //這個(gè)if是為了去掉最高位上的0,其中out_turn作為

//開關(guān);

if(s[i]==0)

continue;

else{

out_turn=true;

i++;

}

}

else{ //輸出轉(zhuǎn)換之后的結(jié)果,10輸出A,類推

if(s[i]<10)

System.out.print(s[i]);

else

System.out.print((char)('A'+(s[i]-10)));

}

}

System.out.println();

}

}

總結(jié):如此看來(lái),位元算還是很有必要學(xué)習(xí)的。基于計(jì)算機(jī)只認(rèn)識(shí)0和1,很多關(guān)于內(nèi)存的操作用位運(yùn)算效率會(huì)提高不少,畢竟我們是與計(jì)算機(jī)打交道。像 *2/2運(yùn)算、取絕對(duì)值運(yùn)算,取相反數(shù)運(yùn)算等等,直接對(duì)內(nèi)存進(jìn)行移位或者反碼,快了不少。

無(wú)論學(xué)習(xí)什么東西,基礎(chǔ)、原理性質(zhì)的東西一定要好好學(xué)。不要以為用的少了就不重視。

更多位元算的功能:911博客??csdn/人在江湖

總結(jié)

以上是生活随笔為你收集整理的java反码算术运算求和,位运算的妙用,运算妙用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。