日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

二进制数代替数组做标记

發(fā)布時(shí)間:2025/4/5 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二进制数代替数组做标记 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

今天做一道輸出第一次出現(xiàn)的數(shù)題目時(shí),使用了用一個(gè)數(shù)組存儲之前出現(xiàn)過的數(shù),然后搜索數(shù)組判斷是否出現(xiàn)過。這是用時(shí)間換空間的方法。

當(dāng)然也可以用空間換時(shí)間,如果數(shù)據(jù)范圍已知且不大,比如為1到100
可以直接定義一個(gè)大小為100的數(shù)組 初始化為0
輸入一個(gè)數(shù)時(shí),若a[i-1]為0則輸出,并對a[i-1]做標(biāo)記

然后想到了用二進(jìn)制數(shù)作為標(biāo)記的方法,進(jìn)一步節(jié)省空間。但是只能用于數(shù)據(jù)范圍很小的數(shù) 比如0-30
若0出現(xiàn)了則第0位為1
30出現(xiàn)了則第30位置為1,即該數(shù)加上2的30次方
輸入時(shí),比如要判斷30是否出現(xiàn)過,將該數(shù)除以2的30次方然后mod10不為0則第30位為1

#include<stdio.h> int main() {int a[20]={0};int i,n;for(i=0;i<20;i++){scanf("%d",&a[i]);if(search(a,a[i],i)==0){printf("%d ",a[i]);} } return 0; } int search(int a[],int t,int size) {int i;for(i=0;i<size;i++){if(a[i]==t)return 1;}return 0; } #include<stdio.h> int i,a,b,n; long long num[8]={0}; for(a=1;a<20;a++) {for(b=1;b<20;b++){n=a*a+b*b;if(n<=400){num[n/64]=(((num[n/64]>>(n%64))|1)<<(n%64))|num[n/64];}} }for(i=0;i<=400;i++) {if((num[i/64]<<63)>>63&1==1)printf("%d ",i);num[i/64]=num[i/64]>>1; }

關(guān)鍵代碼:
num[n/64]=(((num[n/64]>>(n%64))|1)<<(n%64))|num[n/64];
n為要標(biāo)記的數(shù),n/64確定標(biāo)記數(shù)組中的下標(biāo),也就是數(shù)組中第一個(gè)long long 負(fù)責(zé)標(biāo)記0-63 第二個(gè)標(biāo)記64-127 以此類推
n%64為應(yīng)該標(biāo)記數(shù)組中第n/64個(gè)數(shù)的第幾位
通過先右移,最低位置1,然后左移實(shí)現(xiàn)修改
由于右移過程中低位丟失,所以需要再與原來的數(shù)按位取或,恢復(fù)前面的值

讀取標(biāo)記位
if((num[i/64]<<63)>>63&1==1)
通過左移后右移再與1按位與判斷最低位是否為1

并且每輪num[i/64]=num[i/64]>>1; 右移一位

總結(jié)

以上是生活随笔為你收集整理的二进制数代替数组做标记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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