js互斥演算法
① JS位運算符
之前對js的一些涉及到二進制的運算符一直似懂非懂,看到了就一臉懵逼,還得去控制台算一下。然後最近看演算法的時候又看到了這個運算符,這里就簡單介紹一下學習這些位運算符的過程。
注意: 以下運算均不涉及到小數。
先說這句話是什麼意思。左移位是二進制的一種運算,就是在不改變二進制數值32位長度的前提下,將每位的數字都向左移動,左邊移出去的直接丟棄,右邊空出來的位置用0填充。無符隱做號就是保持符號位不變,即本來是正數,移位後一樣為正數。
這里以 7 << 2 為例。
首先將7轉為二進制是 0000 0000 0000 0000 0000 0000 0000 0111 .
然後對其向左移兩位.
得到值為 0000 0000 0000 0000 0000 0000 0001 1100 .
轉換為十進制為 28.即 7 << 2 = 28 。
然後我們對以上的運算過程做一個處理,將這些二進制轉換為我們熟悉的十進制。
對移位後的算式進行合並項可得到 2^4 + 2^3 + 2^2 = (2^2 + 2^1 + 2^0) * 2^2 ,即 2^4 + 2^3 + 2^2 = (2^2 + 2^1 + 2^0) * 2^2 = 7 * 2^2 。由此我們可得出 7 << 2 = 7 * 2^2 = 28 。
我們通過計算幾個簡單的左移位運算,與標准答案進行比較,驗證一下這個結論。
在控制台中以上幾個算式的碧基結果為
答案完全一致。說明我們的結論是正確的。當然這個結論 僅限於那些二進制移位不會左移移出的數字的簡單運算 。當我們遇到一些簡單的可以口算的左移位運算時就可以使用這個結論快速得到結果,如果對於 99999 << 66 這種較復雜的運算你也用這個結論計算,也沒有人會介意。
下面我們看一下負數的左移位運算。以 -66 << 2 為例。
首先,我們先復習一下負數如何轉換為二進制。
負數轉換為二進制的步驟有三:
然後對其向左移兩位.
得到值為 1111 1111 1111 1111 1111 1110 1111 1000 .然後我們將其轉換成十進制。
轉換為十進制為 -264.即 -66 << 2 = -264 。
剛剛我們計算 -66 的二進製得到的是 1111 1111 1111 1111 1111 1111 1011 1110 。我們在控制台驗證一下我們得到的這個二進制。
我們比較一下下面幾個算式。
是的沒錯,進行無符號左移位運算時,當兩個數的絕對值相等時,其相同位數的移位的絕對值一定相等悔攜謹。
這里以 666 >> 3 為例。
首先將666轉換為二進制是 0000 0000 0000 0000 0000 0010 1001 1010 。
然後對其向右移三位。
得到值為 0000 0000 0000 0000 0000 0000 0101 0011 .
轉換為十進制為 83.即 666 >> 3 = 83 。
然後我們對以上的運算過程做一個處理,將這些二進制轉換為我們熟悉的十進制。
這個規律好像不太好總結?
這里以 -666 >> 3 為例。
因為是有符號的運算,所以這里不再適用上一小節說的js的特殊處理。先將-666轉換為二進制。
即-666的二進制形式為 1111 1111 1111 1111 1111 1101 0110 0110 ,然後對其進行有符號右移位運算
移位後得到的值為 1111 1111 1111 1111 1111 1111 1010 1100 ,是一個負值,我們將其轉成十進制。
我們對此結果進行驗證。
可見,我們的運算是完全正確的。
這里我們以 666 >>> 3 為例。
首先將666轉換為二進制是 0000 0000 0000 0000 0000 0010 1001 1010 。
然後對其向右移三位。
得到值為 0000 0000 0000 0000 0000 0000 0101 0011 .
轉換為十進制為 83.即 666 >> 3 = 83 。
這里以 -666 >> 3 為例。
因為是有符號的運算,所以這里不再適用上一小節說的js的特殊處理。先將-666轉換為二進制。
即-666的二進制形式為 1111 1111 1111 1111 1111 1101 0110 0110 ,然後對其進行有符號右移位運算
移位後得到的值為 0001 1111 1111 1111 1111 1111 1010 1100 ,轉成十進制為536870828。
是不是超級大。因為是無符號右移位運算,所以在左邊空出部分不論正負都會填充0.
我們對此結果進行驗證。
可見,我們的運算是完全正確的。
注意:因為對負數進行無符號右移位運算時,所得結果很大,所以在使用過程中需要格外注意。
疑問:左移位和右移位根本都是只對位置進行了移動,那麼對於 x1 >> k = y1 和 y2 << k = x2 中的 x1 等於 x2 , y1 等於 y2 嗎?
不一定。因為我們不能確保移動過程中被丟棄的值均為0。但凡有一個1被丟棄,就不會相等。而如果被丟棄的都是0,那麼 x1 === x2 y1 === y2 。如下圖所示。
這里以 66 & 33 為例。
首先將兩個數轉換為二進制是 0000 0000 0000 0000 0000 0000 0100 0010 和 0000 0000 0000 0000 0000 0000 0010 0001 。
然後對其進行與運算。
得出結果為 0.
負數的與運算與正數並無區別,不做討論。
這里以 66 | 66 為例。
首先將兩個數轉換為二進制是 0000 0000 0000 0000 0000 0000 0100 0010 和 0000 0000 0000 0000 0000 0000 0100 0010 。
然後對其進行與運算。
得出結果為 66.
負數的與運算與正數並無區別,不做討論。
這里以 66 ^ 66 為例。
首先將兩個數轉換為二進制是 0000 0000 0000 0000 0000 0000 0100 0010 和 0000 0000 0000 0000 0000 0000 0100 0010 。
然後對其進行與運算。
得出結果為 0.
負數的與運算與正數並無區別,不做討論。
這里以 ~66 為例。
首先將其轉換為二進制是 0000 0000 0000 0000 0000 0000 0100 0010 。
然後對其進行與運算。
將結果( 1111 1111 1111 1111 1111 1111 1011 1101 )轉換為十進制
得出結果為 -67.
這里我們再我看幾個例子。
從中我們可以看出, 位非操作就是對數字加一,然後取負 。我們可以寫個簡單的判斷方法來驗證。
位運算符運算結果非常有趣,在平時可以多加應用,但是一定要注意可能產生大數的預算,避免產生不必要的BUG。
這篇文章只是做了一個簡單的介紹。後面有空了會做一下在實際開發中的應用,雖然我可能很久都遇不到。
javaScript學習指南:JS入門教程
② 關於GUI渲染線程與JS引擎線程的那些事
GUI渲坦基染線程與JS引擎線程是念猜互斥的,當JS引擎執行時GUI線程會被掛起(相當於被凍結了),GUI更新會被保存在一個隊列中,等到JS引擎空閑時,立即被執行。讓高謹
tip: 關於debugger的阻塞
以上內容純屬瞎編,各位看官請謹慎
③ js中常見的數據加密與解密的方法
加密在我們前端的開發中也是經常遇見的。本文只把我們常用的加密方法進行總結。不去糾結加密的具體實現方式(密碼學,太龐大了)。
常見的加密演算法基本分為這幾類,
RSA加密:RSA加密演算法是一種非對稱加密演算法。在公開密鑰加密和電子商業中RSA被廣泛使用。(這才是正經的加密演算法)
非對稱加密演算法:非對稱加密演算法需要兩個密鑰:公開密鑰(publickey:簡稱公鑰)和私有密鑰(privatekey:簡稱私鑰)。公鑰與私鑰是一對,如果用公鑰對數據進行加密,只有用對應的私鑰才能解密。因為加密和解密使用的是兩個不同的密鑰,所以這種演算法叫作非對稱加密演算法。
DES全稱為Data Encryption Standard,即數據加密標准,是一種使用密鑰加密的塊演算法
DES演算法的入口參數有三個:Key、Data、Mode。其中Key為7個位元組共56位,是DES演算法的工作密鑰;Data為8個位元組64位,是要被加密或被解密的數據;Mode為DES的工作方式,有兩種:加密或解密。
AES這個標准用來替代原先的DES
DES/AES我們合並在一起介紹其用法和特點
Base64是一種用64個字元來表示任意二進制數據的方法。base64是一種編碼方式而不是加密演算法。只是看上去像是加密而已(嚇唬人)。
④ JS中的各種排序方法
數據結構演算法中排序有很多種,常見的、不常見的,至少包含十種以上。根據它們的特性,可以大致分為兩種類型:比較類排序和非比較類排序
冒泡排序是一次比較兩個元素,如果順序是錯誤的就把它們交換過來。,直到不需要再交換
快速排序的基本思想是通過一趟排序,將待排記錄分隔成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分的關鍵字小,則可以分別對這兩部分記錄繼續進行排序,以達到整個序列有序
從數列中挑出一個元素,稱為 「基準」(pivot);然後重新排序數列,所有元素比基準值小的擺放在基準前面、比基準值大的擺在基準的後面;在這個區分搞定之後,該基準就處於數列的中間位置;然後把小於基準值元素的子數列(left)和大於基準值元素的子數列(right)遞歸地調用 quick 方法排序完成,這就是快排的思路
通過構建有序序列,對於未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入,從而達到排序的效果
插入排序的思路是基於數組本身進行調整的,首先循環遍歷從 i 等於 1 開始,拿到當前的 current 的值,去和前面的值比較,如果前面的大於當前的值,就把前面的值和當前的那個值進行交換,通過這樣不斷循環達到了排序的目的
將最小的元素存放在序列的起始位置,再從剩餘未排序元素中繼續尋找最小元素,然後放到已排序的序列後面……以此類推,直到所有元素均排序完畢
堆排序是指利用堆這種數據結構所設計的一種排序演算法。堆積是一個近似完全二叉樹的結構,並同時滿足堆積的性質,即子結點的鍵值或索引總是小於(或者大於)它的父節點。堆的底層實際上就是一棵完全二叉樹,可以用數組實現
歸並排序是建立在歸並操作上的一種有效的排序演算法,該演算法是採用分治法的一個非常典型的應用。將已有序的子序列合並,得到完全有序的序列;先使每個子序列有序,再使子序列段間有序。若將兩個有序表合並成一個有序表,稱為二路歸並
通過 mid 可以把該數組分成左右兩個數組,分別對這兩個進行遞歸調用排序方法,最後將兩個數組按照順序歸並起來
⑤ js+CSS怎麼實現互斥樣式詳見下面
用jquery
點擊時觸發一個函數。比如
<div id="悉山李divNum">
<div id="div1" onclick="changeColor(this.id)"></div>
<div id="睜遲div2" onclick="changeColor(this.id)"></div>
<div id="div3" onclick="changeColor(this.id)"></div>
</div>
將這些div放到一個大的div容器中。
function changeColor(id){
$("#divNum div").css("background-color","blue");//別的唯嘩div變成藍色
$("#"+id).css("background-color","red");//被點擊的變成紅色
}
⑥ js實現遞歸演算法
<!DOCTYPE >
<html>
<head>
<meta content="" charset="utf-8">
<title>函李跡螞數的遞歸調用</title>
</head>
<body>
<script>
//遞歸的概念:自己調用自己
//注意:使用遞歸的時候必須有一個結束標志,否則會報內存溢州鎮出的錯誤 Maximum call stack size exceeded;
/* 1.案例一:求1,2,3...n 的和 */
function fn(n){
if(n===1){
return 1;
}
return n+fn(n-1);
}
//console.log(fn(3));
/* 2.案例二:求1,2,3...到n的階乘 */
function getFactorial(n){
if(n===1){
return 1;
}
return n * getFactorial(n-1);
}
/哪埋/console.log(getFactorial(3));
/* 案例三:斐波那契數列 *///第n個數等於前兩個數的和,除第一個數跟第二個樹外:如1,1,2,3,5,8,11,19,30...
function getNFibonacciSequence(n){
if(n===1 || n===2){
return 1;
}
return getNFibonacciSequence(n-1)+getNFibonacciSequence(n-2);
}
console.log(getNFibonacciSequence(4));
</script>
</body>
</html>
⑦ js方法如何在不同賬號間互斥
帳號總有ID吧,根據ID做不同調用就好
⑧ js 或jq實現 演算法
<scripttype="text/javascript"src="jquery.js"></script>
<div>
theinputnumthatyouwanttocreat:<inputtype="text"id="inputnum"/></br>
total:<inputtype="text"id="total"/>
<divid="inputs"></div>
surplus:<inputtype="text"id="surplus"/>
</div>
<script>
//純手工,望採納
varnum=0;
$(document).ready(function(){
$("#inputnum").blur(function(){
num=parseInt($("#inputnum").val());
$("#inputs").html("");
for(vari=0;i<num;i++){
$("#inputs").append(i+':<inputid="'+i+'"type="text"onblur="checkTotal()"/>');
}
});
});
functioncheckTotal(){
varnowtotal=0;
for(vari=0;i<num;i++){
varvalue=$("#"+i).val();
if(""==value){
return;
}else{
nowtotal=nowtotal+parseInt(value);
}
};
vartotal=parseInt($("#total").val());
if(nowtotal>total){
$("#surplus").val("");
alert("exceedthetotalnumber");
}else{
$("#surplus").val(total-nowtotal);
}
}
</script>
⑨ jsnumber.solve方法
jsnumber.sove方法是JavaScript語言中的一個內置方法孝大,用於將字元串轉換為數字。它可以識別整數、浮點數以及科學計數法表示的數字,並將其轉換為對應的數值類型春遊。如果字元串無法解析為數字,則該方法會返回NaN(Not a Number)。
使用該方法時需要注意的是,它只能將字元串轉換為數字,而不能將其他的數據類型轉換為數字。此外,當解析的字元串中包含非數字字元時,該方法會自動忽略這些字元,只轉換其中的數字部分。
如果需要將數字轉換為字元串,則可以使用toString()方法。例如,將數字10轉換為字元串可以使用以下代碼:var num = 10;var str = num.toString();
總之,jsnumber.sove方法是JavaScript中一個非常常用的方法,它可以輕松實現字元串轉數字的功能,方便了開發者的編程工作。純手打,望采巧森豎納!
⑩ C#.NET JS實現復選框的互斥效果,是指伺服器控制項,不是INPUT控制項
$(document).ready(function(){
//獲取到Checkbox控制項,為控制項綁定點擊事件
$("[name='checkList']").click(function(){
change(this);
});
});
functionchange(obj){
//記錄你點擊的checkbox的選中狀態
varflg=obj.checked;
//然後循環
foreach(variteminitemList){
//判斷哪個是你選中或取消選絕橡中的checkboxobj為你點擊的那個checkbox時傳過來的對象
if(item.value==obj.value){
item.checked=flg;
並梁旁}else{
//不是當前點擊的賦值相反的狀態
渣前item.checked=!flg;
}
}
}