作者 主題: 請問 "例如權限" 程式的計算  (閱讀 5206 次)

0 會員 與 2 訪客 正在閱讀本文。

dark

  • 俺是博士!
  • *****
  • 文章數: 1581
    • 檢視個人資料
請問 "例如權限" 程式的計算
« 於: 2017-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

不知哪位能提供一下答案 , 謝謝!!

dark

  • 俺是博士!
  • *****
  • 文章數: 1581
    • 檢視個人資料
Re: 請問 "例如權限" 程式的計算
« 回覆 #1 於: 2017-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,


netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17484
    • 檢視個人資料
    • http://www.study-area.org
Re: 請問 "例如權限" 程式的計算
« 回覆 #2 於: 2017-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
« 上次編輯: 2017-05-02 22:52 由 netman »

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
Re: 請問 "例如權限" 程式的計算
« 回覆 #3 於: 2017-05-02 22:59 »
判斷一個數值是否包含某數,要用位元運算, 例如

引用
$ (((13&4)==4)) && echo 1 || echo 0
1
$ (((13&2)==2)) && echo 1 || echo 0
0
$

dark

  • 俺是博士!
  • *****
  • 文章數: 1581
    • 檢視個人資料
Re: 請問 "例如權限" 程式的計算
« 回覆 #4 於: 2017-05-03 09:30 »
就是這答案 ... 就是這答案 ... 就是 0 跟 1 .....
哎呀 ... 想那麼久 , 又知道 2 次方 ... 怎就沒跟二進位連線

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