酷!學園

技術討論區 => 程式討論版 => 主題作者是: dark 於 2017-05-02 12:47

主題: 請問 "例如權限" 程式的計算
作者: dark2017-05-02 12:47
像 linux 檔案權限 777 , 755 ...
是將三種狀態 (rwx) 互相搭配的聰明表示法

以此觀念 , 小弟把 5 種資料欄位是否有值 , 以一個數字代表
那就是
資料a = 1 = 2^0
資料b = 2 = 2^1
資料c = 4 = 2^2
資料d = 8 = 2^3
資料e = 16 = 2^4

若值為 13 => 1+4+8 => a , c , d 有資料

0~31 種搭配 , 可能看久了像檔案權限一樣 , 一眼就有答案
今天想程式化
想半天卻想不出 程式 / 數學 上 , 怎麼判斷 13 包含 4

不知哪位能提供一下答案 , 謝謝!!
主題: Re: 請問 "例如權限" 程式的計算
作者: dark2017-05-02 13:25
只想到純程式的方法 ... 想不出數學上的公式解法

1. 把 2 的 n 次一一列出 , 從大的數字開始比
2. 如果比 2**n 大 , 代表包含 , 減去後在筆下一個數字


簡單用 bash 表示

go(){
num=$1
echo -n ,
for i in $(for j in {4..0};do echo $((2**$j));done);do
   if [ $num -ge $i ] ; then echo -n $i, ; num=$(($num-$i)) ; fi
done

}

# go 13
,8,4,1,

主題: Re: 請問 "例如權限" 程式的計算
作者: netman2017-05-02 22:28
換成二進位如何?
代碼: [選擇]
13 =  1 1 0 1
dec:  8 4 0 1

一時技癢,獻醜一下:
代碼: [選擇]
#!/bin/bash
num=$1
while echo "${num:-null}" | grep -q '[^0-9]'; do
read -p "Enter a number: " num
done
bin_str=$(echo "obase=2;ibase=10;$num" | bc)
pos=${#bin_str}
for ((i=0;i<${#bin_str};i++))
do
((pos--))
[ ${bin_str:$i:1} = 1 ] && echo "2^$pos" | bc
done | xargs
主題: Re: 請問 "例如權限" 程式的計算
作者: Yamaka2017-05-02 22:59
判斷一個數值是否包含某數,要用位元運算, 例如

引用
$ (((13&4)==4)) && echo 1 || echo 0
1
$ (((13&2)==2)) && echo 1 || echo 0
0
$
主題: Re: 請問 "例如權限" 程式的計算
作者: dark2017-05-03 09:30
就是這答案 ... 就是這答案 ... 就是 0 跟 1 .....
哎呀 ... 想那麼久 , 又知道 2 次方 ... 怎就沒跟二進位連線

原來位元運算是這個意思阿 ... 小弟現在才知道